Posts tagged: quasicrystal

Quasicrystalline patterns with 5, 7, 9, and 11-fold rotational symmetry.

Mathematica code:

S[x_, y_, w_, a_, t_] := 
Sin[w ((Cos[a] + Sin[a]) x + (Sin[a] - Cos[a]) y) + t*2 Pi]

G[N_, t_,] :=
Graphics[
Table[
Disk[
{x, y},
.55*(1 + Sum[S[x, y, w, a*2 Pi/N, t], {a, 0, N - 1, 1}]/(2 N))],
{x, -25, 25, 1}, {y, -25, 25, 1}],
PlotRange -> 25.85, ImageSize -> 500]

Manipulate[
G[N,t],
{N,{5,7,9,11}}, {t, 0, .95, .05}]
A Penrose tiling can be constructed using just two different tiles in the shape of a thick and thin rhombus:

Here, the angles are multiples of ø = π/5. The edges of these tiles are marked with two different kinds of arrows. This is done to enforce a specific matching rule that ensures that the tiling is non-periodic, which is one of the defining features of Penrose tilings. Different tiles can only be placed next to each other if the touching edges have the same type of arrow and point in the same direction.
If these matching conditions were not in place, then it would be possible to construct tilings which are periodic as shown in the following image. There are translational symmetries present in 8 different directions here:

The image at the top shows a part of a Penrose tiling obeying the matching conditions with the arrows displayed. The numbers are just there to index some other property of directionality not discussed here.
If these matching conditions are satisfied for a complete tiling, then the resulting configuration will always be non-periodic. However, following the matching rules alone does not guarantee an infinite tiling of the entire plane. It is therefore possible to construct finite regions that obey the matching rules, but cannot be extended any further without allowing for periodicities or contradicting the matching rules.
There do exist sets of tiles that will always admit non-periodic tilings in which no extra matching conditions need to be imposed. For a list of such tiles that tile the plane, 3-dimensional space, and even the hyperbolic plane, see this list of aperiodic sets of tiles.
Image sources:
Algebraic Theory of Penrose’s Non-periodic Tiligns of the Plane by N.G. de Bruijn
The Empire Problem in Penrose Tilings by Laura Effinger-Dean

A Penrose tiling can be constructed using just two different tiles in the shape of a thick and thin rhombus:

Here, the angles are multiples of ø = π/5. The edges of these tiles are marked with two different kinds of arrows. This is done to enforce a specific matching rule that ensures that the tiling is non-periodic, which is one of the defining features of Penrose tilings. Different tiles can only be placed next to each other if the touching edges have the same type of arrow and point in the same direction.

If these matching conditions were not in place, then it would be possible to construct tilings which are periodic as shown in the following image. There are translational symmetries present in 8 different directions here:

The image at the top shows a part of a Penrose tiling obeying the matching conditions with the arrows displayed. The numbers are just there to index some other property of directionality not discussed here.

If these matching conditions are satisfied for a complete tiling, then the resulting configuration will always be non-periodic. However, following the matching rules alone does not guarantee an infinite tiling of the entire plane. It is therefore possible to construct finite regions that obey the matching rules, but cannot be extended any further without allowing for periodicities or contradicting the matching rules.

There do exist sets of tiles that will always admit non-periodic tilings in which no extra matching conditions need to be imposed. For a list of such tiles that tile the plane, 3-dimensional space, and even the hyperbolic plane, see this list of aperiodic sets of tiles.

Image sources:

(click through the images to view in high-res)

Penrose tilings are an example of the non-periodic tilings discussed in the last post. Recall that these are tilings that cover the entire infinite plane leaving neither gaps nor overlaps. Whats nice about these tilings is that the set of tiles used to construct the Penrose tilings only consists of two different basic shapes consisting of quadrilaterals

Whats even more remarkable about Penrose tilings is that using just these two shapes it is possible to construct infinitely many different tilings that cover the infinite plane. This infinity is infinitely bigger in size than the countable infinity of the whole numbers ( 1, 2, 3, 4, and so on), but rather equivalent to the uncountable infinity associated to the real numbers (which includes all whole numbers, fractions, and decimals with infinitely many digits).

Despite the existence of these infinitely many different Penrose tilings, there is one peculiar property they all exhibit. Consider any finite region, or patch, of one particular Penrose tiling. Then it is possible to find an exact copy of this patch in any other different Penrose tiling! Moreover, this patch occurs infinitely often in different spots in any given tiling! Note that this is true of any patch of any size no matter how big as long as its finite. This implies that if you were only able to examine a finite part of any Penrose tiling, you could never really distinguish that entire tiling from any other tiling. Thus, different Penrose tilings are only perfectly distinguishable in the infinite limit of the entire plane.

The images shown above display finite regions of Penrose tilings. They are constructed using an elegant “cut-and-project” method (also used here), which involves projecting the points of the integer lattice in 5-dimensional Euclidean space, onto a certain 2-dimensional plane. Connecting adjacent projected points in this plane by lines then yields a Penrose tiling.

Further reading:

Image Source: Wikipedia

QuasiMusic is a Java applet that generates music, functioning a lot like a player-piano roll, by exploiting the patterns in quasiperiodic tilings of the 2 dimensional plane. The animations show two different instances of the applet in action.

These are tilings that fill the entire infinite plane using different shapes called tiles that are arranged in a certain way with out overlapping each other and without leaving any empty space.

If its possible to take a copy of a tiling and shift it over in some direction by a certain amount relative to the original tiling and have it line up exactly with the original, then that tiling is periodic. This minimum shifting distance needed to make the tiling match itself is called the period.

Whats special about quasiperiodic tilings is that there is no such period. So no matter which direction you shifted the tiling, it would never exactly line up with itself.

Using these quasiperiodic tilings has interesting consequences for the music they generate. Since the pattern never repeats, this implies that the music will never repeat. Although there may be moments which sound similar they can never be exactly the same when considered in a longer time interval.

To understand how the applet creates the music from a given tiling first assign to each type of tile a sound (instrument and pitch). Next, imagine a series of vertical lines passing over the tiling. Then as the whole tiling moves upwards passing a horizontal axis, play a sound each time one type of tiling changes to another type on one of these vertical lines. In the animations, the tiles light up when they trigger a sound, and the series of vertically arranged white dots specify when the tiles change. These white dots are reminiscent of the holes in a player-piano roll.

The applet allows the user to control many different parameters, and their are over 350 different instruments and sounds to choose from literally allowing for endless possibilities. Check it out here.

Also check out a recently released dark ambient album which makes use of QuasiMusic on some tracks by master mathematics expositor John Baez.


High-res: 800x800
Mathematica code:
f[x_, y_] := {Log[Sqrt[(x)^2 + (y)^2]], ArcTan[x, y]}ImageTransformation[  ImageCrop[   DensityPlot[     Sum[Cos[(Cos[n*2*Pi/5] + Sin[n*2*Pi/5])* x + (Cos[n*2*Pi/5] - Sin[n*2*Pi/5])*y],    {n, 0, 4, 1}], {x, -125, 125}, {y, -125, 125},   PlotPoints -> 200, Mesh -> False, Frame -> False,    ColorFunction -> GrayLevel, ImageSize -> 834],  800], f[#[[1]], #[[2]]] &, DataRange -> {{-Pi, Pi}, {-Pi, Pi}}]

High-res: 800x800

Mathematica code:

f[x_, y_] := {Log[Sqrt[(x)^2 + (y)^2]], ArcTan[x, y]}

ImageTransformation[
ImageCrop[
DensityPlot[
Sum[Cos[(Cos[n*2*Pi/5] + Sin[n*2*Pi/5])* x + (Cos[n*2*Pi/5] - Sin[n*2*Pi/5])*y],
{n, 0, 4, 1}], {x, -125, 125}, {y, -125, 125},
PlotPoints -> 200, Mesh -> False, Frame -> False,
ColorFunction -> GrayLevel, ImageSize -> 834],
800],
f[#[[1]], #[[2]]] &, DataRange -> {{-Pi, Pi}, {-Pi, Pi}}]

High-res: 770x770
Mathematica code:
ContourPlot[   Sum[Cos[(Cos[n*2*Pi/7] + Sin[n*2*Pi/7])*x + (Cos[n*2*Pi/7] - Sin[n*2*Pi/7])*y],    {n, 0, 6, 1}], {x, -100, 100}, {y, -100, 100}, PlotPoints -> 70, Mesh -> False, Frame -> False, ColorFunction -> "CandyColors", ImageSize -> 800]

High-res: 770x770

Mathematica code:

ContourPlot[
Sum[Cos[(Cos[n*2*Pi/7] + Sin[n*2*Pi/7])*x + (Cos[n*2*Pi/7] - Sin[n*2*Pi/7])*y],
{n, 0, 6, 1}], {x, -100, 100}, {y, -100, 100},
PlotPoints -> 70, Mesh -> False, Frame -> False, ColorFunction -> "CandyColors", ImageSize -> 800]

High-res: 770x770
Mathematica code:
ContourPlot[   Sum[Cos[(Cos[n*2*Pi/7] + Sin[n*2*Pi/7])*x + (Cos[n*2*Pi/7] - Sin[n*2*Pi/7])*y],    {n, 0, 6, 1}], {x, -70, 70}, {y, -70, 70}, PlotPoints -> 100, Mesh -> False, Frame -> False, ColorFunction -> Hue[.9, .6, z + .3], ImageSize -> 800]

High-res: 770x770

Mathematica code:

ContourPlot[
Sum[Cos[(Cos[n*2*Pi/7] + Sin[n*2*Pi/7])*x + (Cos[n*2*Pi/7] - Sin[n*2*Pi/7])*y],
{n, 0, 6, 1}], {x, -70, 70}, {y, -70, 70},
PlotPoints -> 100, Mesh -> False, Frame -> False, ColorFunction -> Hue[.9, .6, z + .3], ImageSize -> 800]

Mathematica code:
Animate[    DensityPlot[        Sum[Cos[(Cos[n*2*Pi/23] + Sin[n*2*Pi/23])*x + (Cos[n*2*Pi/23] - Sin[n*2*Pi/23])*y + t],         {n, 0, 22, 1}], {x, -150, 150}, {y, -150, 150},     PlotPoints -> 150, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 522],{t, 0, 2*Pi, Pi/10}]

Mathematica code:

Animate[
 DensityPlot[
Sum[Cos[(Cos[n*2*Pi/23] + Sin[n*2*Pi/23])*x + (Cos[n*2*Pi/23] - Sin[n*2*Pi/23])*y + t],
{n, 0, 22, 1}], {x, -150, 150}, {y, -150, 150},
PlotPoints -> 150, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 522],
{t, 0, 2*Pi, Pi/10}]
High-res: 800x800
Mathematica code:
DensityPlot[   Sum[Cos[(Cos[n*2*Pi/23] + Sin[n*2*Pi/23])*x + (Cos[n*2*Pi/23] - Sin[n*2*Pi/23])*y + 3*Pi/20],    {n, 0, 22, 1}], {x, -170, 170}, {y, -170, 170}, PlotPoints -> 170, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]

High-res: 800x800

Mathematica code:

DensityPlot[
Sum[Cos[(Cos[n*2*Pi/23] + Sin[n*2*Pi/23])*x + (Cos[n*2*Pi/23] - Sin[n*2*Pi/23])*y + 3*Pi/20],
{n, 0, 22, 1}], {x, -170, 170}, {y, -170, 170},
PlotPoints -> 170, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]
High-res: 800x800
Mathematica code:
DensityPlot[   Sum[Cos[(Cos[n*2*Pi/23] + Sin[n*2*Pi/23])*x + (Cos[n*2*Pi/23] - Sin[n*2*Pi/23])*y + 3*Pi/5],    {n, 0, 22, 1}], {x, -170, 170}, {y, -170, 170}, PlotPoints -> 170, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]

High-res: 800x800

Mathematica code:

DensityPlot[
Sum[Cos[(Cos[n*2*Pi/23] + Sin[n*2*Pi/23])*x + (Cos[n*2*Pi/23] - Sin[n*2*Pi/23])*y + 3*Pi/5],
{n, 0, 22, 1}], {x, -170, 170}, {y, -170, 170},
PlotPoints -> 170, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]

Mathematica code:
Animate[    DensityPlot[        Sum[Cos[(Cos[n*2*Pi/13] + Sin[n*2*Pi/13])*x + (Cos[n*2*Pi/13] - Sin[n*2*Pi/13])*y + t],         {n, 0, 12, 1}], {x, -100, 100}, {y, -100, 100},     PlotPoints -> 100, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 520],{t, 0, 2*Pi, Pi/10}]

Mathematica code:

Animate[
 DensityPlot[
Sum[Cos[(Cos[n*2*Pi/13] + Sin[n*2*Pi/13])*x + (Cos[n*2*Pi/13] - Sin[n*2*Pi/13])*y + t],
{n, 0, 12, 1}], {x, -100, 100}, {y, -100, 100},
PlotPoints -> 100, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 520],
{t, 0, 2*Pi, Pi/10}]

High-res: 800x800
Mathematica code:
DensityPlot[     Sum[Cos[(Cos[n*2*Pi/13] + Sin[n*2*Pi/13])*x + (Cos[n*2*Pi/13] - Sin[n*2*Pi/13])*y + 2*Pi/5],      {n, 0, 12, 1}], {x, -180, 180}, {y, -180, 180},PlotPoints -> 175, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]

High-res: 800x800

Mathematica code:

DensityPlot[
Sum[Cos[(Cos[n*2*Pi/13] + Sin[n*2*Pi/13])*x + (Cos[n*2*Pi/13] - Sin[n*2*Pi/13])*y + 2*Pi/5],
{n, 0, 12, 1}], {x, -180, 180}, {y, -180, 180},
PlotPoints -> 175, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]

High-res: 800x800
Mathematica code:
DensityPlot[     Sum[Cos[(Cos[n*2*Pi/13] + Sin[n*2*Pi/13])*x + (Cos[n*2*Pi/13] - Sin[n*2*Pi/13])*y + Pi],      {n, 0, 12, 1}], {x, -180, 180}, {y, -180, 180},PlotPoints -> 175, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]

High-res: 800x800

Mathematica code:

DensityPlot[
Sum[Cos[(Cos[n*2*Pi/13] + Sin[n*2*Pi/13])*x + (Cos[n*2*Pi/13] - Sin[n*2*Pi/13])*y + Pi],
{n, 0, 12, 1}], {x, -180, 180}, {y, -180, 180},
PlotPoints -> 175, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]

High-res: 800x800
Mathematica code:
DensityPlot[     Sum[Cos[(Cos[n*2*Pi/13] + Sin[n*2*Pi/13])*x + (Cos[n*2*Pi/13] - Sin[n*2*Pi/13])*y + Pi],      {n, 0, 12, 1}], {x, -100, 100}, {y, -100, 100},PlotPoints -> 100, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]

High-res: 800x800

Mathematica code:

DensityPlot[
Sum[Cos[(Cos[n*2*Pi/13] + Sin[n*2*Pi/13])*x + (Cos[n*2*Pi/13] - Sin[n*2*Pi/13])*y + Pi],
{n, 0, 12, 1}], {x, -100, 100}, {y, -100, 100},
PlotPoints -> 100, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 834]
High-res: 800x800
Mathematica code:
DensityPlot[     Sum[Cos[(Cos[n*2*Pi/9] + Sin[n*2*Pi/9])*x + (Cos[n*2*Pi/9] - Sin[n*2*Pi/9])*y + Pi],      {n, 0, 8, 1}], {x, -70, 70}, {y, -70, 70},PlotPoints -> 150, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 800]

High-res: 800x800

Mathematica code:

DensityPlot[
Sum[Cos[(Cos[n*2*Pi/9] + Sin[n*2*Pi/9])*x + (Cos[n*2*Pi/9] - Sin[n*2*Pi/9])*y + Pi],
{n, 0, 8, 1}], {x, -70, 70}, {y, -70, 70},
PlotPoints -> 150, Mesh -> False, Frame -> False, ColorFunction -> Hue, ImageSize -> 800]