Het Mondriaan generator experiment

Soms experimenteer je met hardware, gewoon omdat het leuk is om er ervaring mee op te doen. En waarschijnlijk komt die kennis in de toekomst vast nog eens van pas. Zo kocht mancaver Felix onlangs een color LCD shield, waarvoor hij al snel een leuke toepassing vond: het genereren van willekeurige, Mondriaan-achtige kleurvlakken.

“Het LCD shield dat ik gebruik dateert uit 2009 en bevat een Nokia 6100-like LCD scherm van 128×128 pixels met een pixelresolutie van 12 bits (4R+4G+4B). Na wat uurtjes gepuzzel met de software had ik de eerste demo werkend, een analoge klok. Geinspireerd door een uitzending van Pauw en Witteman over het project Elegante Algoritmes, besloot ik een poging te doen om een softwarealgoritme te ontwikkelen dat automatisch een Mondriaan-achtig plaatje genereert. De Victory Boogie Woogie  uit 1944 zit er niet in -daarvoor zijn de afmetingen van het LCD-scherm te klein- maar een wat eenvoudigere variant leek me wel een poging waard. Het is mij gebleken dat je met een verbluffend eenvoudig algoritme al hele leuke resultaten kunt bereiken.

Sparkfun LCD shield

Matrix

Als basis voor het algoritme dient een ‘canvas’-matrix waarop de software het schilderij kan gaan tekenen. Deze canvas-matrix is tweedimensionaal (rij, kolom) en bestaat uit pixelsegmenten waarbij 1 pixel-segment overeen komt met exact 8×8 beeldpixels. Uitgaande van een LCD-beeldscherm van  128×128 beeldpixels bevat de canvas-matrix dus 16×16 pixelsegmenten. ‘Tekenen op het canvas’ betekent dat de software  automatisch ogenschijnlijk willekeurige rechthoeken van verschillende afmetingen op het canvas plaatst, variërend van 1×1 pixelsegment tot 3×4 pixelsegmenten, net zolang tot het hele canvas volledig met rechthoeken gevuld is. Elke rechthoek is omrand met een zwarte lijn en wordt door de software random voorzien van een fill-color. In lijn met de Mondriaan-stijl bestaat het kleurenpalet uit blauw, geel, rood, zwart of (meestal) wit.

Mondriaan

Algoritme

Het algoritme bestaat in feite uit 2 delen:

  • Het eerste deel zoekt naar de eerstvolgende vrije plek op het canvas. Het zoeken naar een lege plek in de matrix loopt van linksboven naar rechtsonder. Het algoritme is klaar zodra alle pixel-elementen in de matrix gevuld zijn.
  • Het tweede deel van het algoritme probeert op de vrije plek een rechthoek met random afmetingen te passen, waarbij natuurlijk geen overlap mag ontstaan met eerder geplaatste, naburige rechthoeken. Indien de te plaatsen rechthoek niet blijkt te passen wordt opnieuw een rechthoek -nu met andere afmetingen- gekozen en wordt geprobeerd deze nieuwe rechthoek alsnog te plaatsen. Dit laatste proces wordt net zo lang herhaald tot dat het gelukt is om een rechthoek in te passen.

Natuurlijk kost het nog enige tuning om het Mondriaangevoel op te wekken. Zo kun je spelen met de maximaal toegestane afmetingen van de rechthoeken en met de mate waarin kleuren in het kleurenpalet afgewisseld worden. Daarom zijn in de voorbeeldcode drie varianten geimplementeerd, waarbij iedere drukschakelaar is gekoppeld aan 1 van die varianten. Zie de video hieronder.

http://www.youtube.com/watch?v=Aj_wrSMSLkM

De voorbeeldcode biedt mijns inziens een aardig schot in de richting, maar smaken verschillen en het staat eenieder vrij om nieuwe puntjes op de i te plaatsen. Veel succes met zelf experimenteren en optimaliseren.”

Kijk voor meer toffe Arduinoprojecten op Felix’ eigen blog.

Plaats reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *