Skip to content

Puzzle Geometry

In order to build a puzzle in Hyperspeedcube, first you must understand the geometry of the puzzle. Fundamentally, we build puzzles by starting with a base shape, slicing it, and then defining how to transform pieces during twists. We have shorthand words for common ways to do this; for example:

  • The 33 puzzle is a shallow-cut face-turning cube.
  • The 23 puzzle is a half-cut face-turning cube.
  • The Skewb is a half-cut vertex-turning cube.
  • The Halpern-Maier Tetrahedron is either a deep-cut vertex-turning tetrahedron or a shallow-cut face-turning tetrahedron.
  • The Megaminx is a shallow-cut face-turning dodecahedron.
  • The Square-1 is a cube shapemod of a bandaged 3-layer half-cut 12-gonal prism.
  • The Curvy Copter and Helicopter Cube are both shallow-cut edge-turning cubes.
  • The Pentultimate is a half-cut face-turning dodecahedron.
  • The face-turning octahedron is — you guessed it! — a face-turning octahedron.

What do these terms mean? Let's start with the "X-turning" terms:

  • face-turning means that the cuts are parallel to the face planes, and the twists rotate pieces in the plane of the face.
  • vertex-turning means that cuts correspond to vertices of the shape, and the twists rotate pieces around vertices.

You may also see edge-turning, facet-turning, and ridge-turning. (We prefer the terms "facet" and "ridge" in 4D, since "face" is used ambiguously in hypercubing.)

  • shallow-cut means that the cuts are close to the outside of the polytope, and making them closer to the outside doesn't change the puzzle.
  • half-cut means that the cuts pass through the center of the puzzle.
  • cut-to-adjacent means that the cuts pass through the adjacent axes.
  • deeper-cut-than-adjacent means that the cuts are deeper than the adjacent turning axes.
  • deep-cut is somewhat vague and has a few different definitions depending on who you ask; in this guide, we'll use it to mean "deeper than shallow-cut, and not better described by one of the other terms."

Point groups

Group theory is tremendously useful for writing puzzle definitions. Here's a quick crash course on point groups, which are the main kind of group we care about:

A point group is a set of transformations of space that keep the origin fixed (i.e., rotations, reflections, and combinations of those). Each transformation is an element of the group. We can compose two elements by doing one transformation after the other, which produces another element in the set. Each element has an inverse, which is just the reverse transformation. Lastly, there's an identity element, which is the transformation that keeps everything where it is.

The point groups used in puzzle definitions will be finite, and we'll construct them by describing their generators, which are a handful of elements that can be combined and inverted to get every element of the group. We say that the generators generate the group.

Coxeter groups

Shapes can be described with names, like "cube" or "dodecahedron" or "12-gonal prism." The most important property of a shape is its symmetry group, which is all the ways it can be rotated & reflected and still look the same. The symmetries of most shapes we care about are a special kind of point group called a Coxeter group, which are written using Coxeter-Dynkin diagrams.

A Coxeter group is generated by a handful of reflections. We can describe Coxeter groups using diagrams like these:

Coxeter diagrams for finite Coxeter groups

In each diagram, a node (one of the dots) corresponds to a reflection. Think of each node as representing a (hyper)plane, and the reflection across it. For any pair of dots:

  • If there's no line directly connecting them, then their mirrors have a \(\frac{\pi}{2}\) angle between them (i.e., they are orthogonal)
  • If there's a line directly connecting them with no label, then their mirrors have a \(\frac{\pi}{3}\) angle between them
  • If there's a line directly connecting them labeled with a number \(n\), then their mirrors have a \(\frac{\pi}{n}\) angle between them

Mirror convention

It doesn't actually matter where the mirrors are in space, but there's a convention:

  • The first mirror plane is perpendicular to the X axis
  • The second mirror plane is perpendicular to some vector in the XY plane
  • The third mirror plane is perpendicular to some vector in the XYZ subspace
  • etc.

This ensures that a Coxeter group generated from \(n\) mirrors always fits within \(n\)-dimensional space.

To understand how this lets us generate shapes, I highly recommend reading the section titled Symmetries of the cube in the excellent article Building 4D polytopes by Mikael Hvidtfeldt Christensen.

TODO: how to introduce face poles and Dynkin vector notation (oox/xoo/etc.)?


EVERYTHING BELOW THIS LINE NEEDS TO BE REVISITED

Most of the Coxeter diagrams we use in puzzle construction are linear (i.e., the diagram has no branching), so we can write them using Schläfli symbols.

Schläfli symbols use numbers and curly braces to describe a Coxeter group. For example, here are the Schläfli symbols for the five platonic solids in 3D:

  • \(\{ 3, 3 \}\) = Tetrahedron
  • \(\{ 3, 4 \}\) = Octahedron
  • \(\{ 3, 5 \}\) = Icosahedron
  • \(\{ 4, 3 \}\) = Cube
  • \(\{ 5, 3 \}\) = Dodecahedron

Exercise

If you have any D&D dice lying around, go get them right now and use them to follow along in this next section! 🐉

The first number in each pair tells you what the base polygon is. For a tetrahedron it's \(\{ 3 \}\), a triangle. For a cube it's \(\{ 4 \}\), a square. For a dodecahedron it's \(\{ 5 \}\), a pentagon. (All of these are regular polygons of course, since we want as much symmetry as possible!)

The second number tells you how many of those polygons are situated around a vertex. For the cube, tetrahedron, and dodecahedron, there are three faces around a vertex. For the octahedron, there's four faces around a vertex. For the icosahedron, there's five. You could also think of this as describing the vertex figure of the shape.

Mirror structure

We've already seen how Schläfli symbols correspond to shapes, but they're much more general than that.

You might wonder how a Coxeter diagram

Duals

Notice that the octahedron has the same Schläfli symbol as the cube, but reversed. This isn't a coincidence — the cube and octahedron have the same symmetry! To see this for yourself, hold an octahedron with one vertex facing toward you and a vertex facing up. Now put a vertex in the center of each triangular face and connect them to form a cube.

  • The 8 triangular faces of the octahedron become the 8 vertices of the cube.
  • The 12 edges of the octahedron become the 12 edges of the cube.
  • The 6 vertices of the octahedron become the 6 square faces of the cube.

We say that the cube and octahedron are dual shapes.

Exercise

The dodecahedron and icosahedron are also dual. What properties correspond between them?

Exercise

What's the dual of the tetrahedron?

Case study: the rhombic dodecahedron

Let's look at a fun shape: the rhombic dodecahedron.

  • It has 12 faces, all rhombi.
  • It is face-transitive, meaning the polyhedron can be reoriented to put any face in the place of any other.
  • It is not vertex-transitive. 6 vertices have 3 edges and 8 vertices have 4 edges.

Some of those numbers look familiar ... 6, 8, and 12 showed up in the cube and octahedron. Indeed, the rhombic dodecahedron has cubic symmetry, which is equivalent to octahedral symmetry. The faces of the rhombic dodecahedron correspond to the edges of the cube. We'll come back to this later when we start generating shapes.

Coxeter group names

While a cube and an octahedron are different shapes with different Schläfli symbols, they have the same symmetry. In fact, you might find yourself building a puzzle like the Corner-Turning Octahedron, which has some elements with cubic symmetry and some with octahedral symmetry. Which Schläfli symbol should we use, then?

Fear not, for this problem can be solved using even more notation! Every finite Coxeter group has a name. For example, the cubic/octahedral group has the name \(BC_3\), which we write as bc3 in Lua. See the documentation for the cd() function for the full list. In this case \(BC_3\) is the symmetry of the the Schläfli symbol \({ 4, 3 }\)