Animating quasicrystals
This post is inspired by the recent Nobel prize for the discovery of quasicrystals in nature.
We spoke briefly of quasicrystals previously : patterns that appear somewhat periodic but never actually repeat. Two-dimensional quasicrystals can be generated by summing together four or more plane waves. In collaboration with Keegan, we've explored what happens when you make these plane waves travel, and also viewing the quasicrystals in logarithmic coordinates as shown in this earlier post.
The Java code below generated sequences of images for animation. Once you have a series of images, you can use Gimp to make an animated GIF. (Convert to black-and-white and 8-color indexed mode before saving to reduce file size.)
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import static java.lang.Math.*; public class QUASI1 { public static void main(String [] args) throws IOException { int k=4; //numer of plane waves int stripes = 27; //number of stripes per wave int N = 800; //image size in pixels int N2 = N/2; BufferedImage it = new BufferedImage(N,N,BufferedImage.TYPE_INT_RGB); for (double phase=0; phase<2*PI; phase+=2*PI/30) { for ( int i=0; i<N; i++ ) for ( int j=0; j<N; j++ ) { double x = j-N2, y = i-N2; //cartesian coordinates double theta = atan2(y,x); //log-polar coordinates double r = log(sqrt(x*x+y*y)); double C=0; // accumulator for (double t=0; t<PI; t+=PI/k) C+=cos((theta*cos(t)-r*sin(t))*stripes+phase); // use the following line for cartesian crystals: //C+=cos((x*cos(t)+y*sin(t))*2*PI*stripes/N+phase); int c=(int)((C+k)/(k*2)*255); it.setRGB(i,j,c|(c<<8)|(c<<16)); } ImageIO.write(it,"png",new File("Test"+(int)(180*phase/PI)+".png")) ; } } }
Changing K will change the degree of symmetry in the crystal. Changing N sets the size of the output images. Changing stripes sets how many wave cycles fit in the rendered image, with larger numbers leading to finer structure.
Since quasicrystals are aperiodic, it is not possible to wrap them around the log-polar "tunnel" ( seen on the left above ) such that two edges of the image meet perfectly. However, for quasicrystals composed of only a few plane waves, you can sometimes get two regions to align well enough to be unnoticeable, especially in black and white.