Ecstatic Geometry

Ecstatic Geometry

An exploration of the harmony between man and machine, poetry and technology, colour and space. Published on fxhash on May 24, 2023.

Technical details

The patterns produced by the Voronoi algorithm are typically asymmetrical - think crazy paving or a mesh of bubbles. But this only happens when the points feed to the algorithm are randomly generated. If the algorithm is initialised with a set of regular points then a regular tessellation is generated. I began experimenting with feeding the algorithm with points on the vertices of regular polygons arranged on various grids. This produced many wonderful tessellations, some that I recognised as Laves tessellations. Others seemed more unique.

To give the composition a focal point, I drew on rosette patterns that are typical of Islamic art. The composition has a central rosette plus a number of ancillary rosettes placed symmetrically around the centre. The first four ancillary rosettes are placed on the corners of the image. The optional remaining eight occupy intermediate positions. Once the number of rosettes has been chosen by the user, a semi-regular grid of points is derived from their vertices and the underlying grid.

Colour

I was particularly inspired in this piece by Andy Gilmore's use of colour. I found that in compositions based on a central rosette, I could assign colours using a colour wheel. I began experimenting with using 3 separate wheels for each colour channel. Mathematically this is equivalent to using sine functions. However I realised that for certain angles the colour produced would be too dark. The solution to this was careful choices of offsets for the sine wave determining the amount of each colour. This is most easily understood from the graph.

Sine waves for each colour channel

I also wanted to ensure vertical symmetry in the composition. The following pseudo-code shows how I calculate the colour of each polygon, given its centroid at (x,y). Angles are in degrees, and the centre of the image is translated to (0,0).

def colour_for_point(x,y,offset) 
  y=-y if x>=0 // Make symmetric
  th = round(atan(-y/x)*90)

  red =   sin(th - 60)             + 1 
  green = sin(th - 165 + offset)   + 1
  blue =  sin(th + 90  + 2*offset) + 1
  sf = 128 // color scale factory
 
  return color(sf*red,sf*gree,sf*blue)

To add some variation a random starting angle is chosen. The colour of a polygon is determined by this, plus the effects of radial symmetry, which are controlled with the Colour Rotation and Colour Multiplier params. The hue param alters the range of the colour wheel from muted, autumnal tones, to bright, psychedelic colours. Additionally, the Colour Vertical parameter which is also derived from the seed may flip the colour wheel in the y-direction for more variation.


Selected Mints


Acknowledgements

2D Voronoi Experiments, Jason Webb, Github