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 ik onlangs een color LCD shield van Sparkfun. Dit shield ontwerp dateert uit 2009 en bevat een Nokia 6100-like LCD scherm van 128×128 pixels met een pixelresolutie van 12 bits (4R+4G+4B). Via de Sparkfun website zijn de bijbehorende library en voorbeeld software te downloaden. Waarschijnlijk is de hardware in de laatste jaren ietswat gewijzigd want er waren een paar kleine aanpassingen nodig om deze driver met mijn shield werkend te krijgen. Na wat uurtjes gepuzzel had ik de eerste demo werkend, een analoge klok. Dus werd het tijd voor een leuke, zelf verzonnen en geprogrammeerde toepassing.
Geinspireerd door een uitzending van Pauw en Witteman over het project “Elegante Algoritmes“, besloot ook ik een poging te doen om een software algoritme te ontwikkelen dat automatisch een Mondriaan-achtig plaatje genereert. Het “Mondriaan Victory Boogie Woogie” schilderij uit 1944 zit er niet in, daarvoor zijn de afmetingen van het LCD scherm te klein. Maar een wat eenvoudigere variant van een Mondriaan leek me wel een poging waard. Het is mij gebleken dat je met een verbluffend eenvoudig algoritme al hele leuke resultaten kunt bereiken.
Als basis voor het algoritme dient een ‘canvas’-matrix waarop de software het schilderij kan gaan tekenen. Deze canvas-matrix is twee-dimensionaal (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, varierend van 1×1 pixelsegment tot 3×4 pixelsegmenten, etc. 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.
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 links-boven naar rechts-onder. 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 Mondriaan gevoel 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 3 varianten geimplementeerd, iedere drukschakelaar is gekoppeld aan 1 van die varianten, zie de video op YouTube.
De voorbeeldcode biedt m.i. 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.