FLAT FOLDABLE

The crease pattern on the left's folded form has been simulated by this library.

Locally Flat Foldable

Global flat-foldability is an np-hard problem.

Local flat foldability concerns the area around 1 intersection of edges, and can be determined using a number of operations including Kawasaki's theorem and Maekawa's theorem.

The following crease pattern has minor errors throughout:

cp.nodes[index].flatFoldable();

Kawasaki's Theorem

The sum of alternating angles around a node must equal 180 degrees.

Kawasaki's Theorem can also be used to discover a 4th additional crease necessary to make a 3-fold unit flat foldable.

What is the missing crease needed to satisfy flat-foldability?

cp.findFlatFoldable();
// crease an edge from the center with that angle
falsecp.nodes[0].flatFoldable();

Maekawa's Theorem

When considering the adjacent edges around a node the number of mountain and valley creases must differ by ±2.

2 Colorability

For a crease pattern to be flat-foldable the graph must be 2-colorable, or a bipartite graph.

This implies that each vertex must have an even number of edges connecting it unless it is a boundary vertex. It also says there will be an even number of boundary vertices.

Folding Algorithm

To simulate the folded state, faces are reflected across neighboring crease lines using a reflection matrix.

To calculate more complex crease patterns, one face is selected to be fixed, then the following data structure is calculated- a tree map of the neighbor relationships to each face.