Inspiré par « Research and Teaching in Art and Science » by Vladimir Bonačić // Computer Graphics and Art Vol. 2, No. 3 pp. 4-8
// This sketch is part of the ReCode Project - http://recodeproject.com //////////////////////////////////////////////////////////////////////// // // // "Orbits of Galois Fields" by Vladimir Bonačić // // // // ( vareractive version ) // // // //////////////////////////////////////////////////////////////////////// // (c) Martin Schneider 2012 // Creative Commons license CC BY-SA 3.0 // These patterns are displayed using 32 x 32 dots. // They visualize objects from abstract algebra, // which are known as orbits of galois fields. // Source: // "Research and Teaching in Art and Science" by Vladimir Bonačić // Computer Graphics and Art Vol. 2, No. 3 pp. 4-8 // See also: // "Kinetic Art: Application of Abstract Algebra to Objects with Computer- // Controlled Flashing Lights and Sound Combinations" by Vladimir Bonačić // Leonardo, Vol. 7, No. 3 // Note: This paper is quite mathematical at times. // The implementation however is actually really simple. ///////////////////////// varERACTIVE VERSION ///////////////////////// // - Use space to flip through the presets // - Use the mouse to explore the orbits //////////////////////////////////////////////////////////////////////// var n = 5; // bits per dimension var d = 1<<n; // cells per dimension var led = 20; // size of the dot var w = led * d + 1; // screen size var preset = [1087, 1157]; var pick = 0; var p = preset[pick]; var debug = true; var i0; var bg=10; function setup() { createCanvas(w, w); ellipseMode(CORNER); noStroke(); } function draw() { // adding some afterglow fill(bg, 30); rect(0, 0, w, w); fill(255 - bg); // use mouse coordinates to get initial cell var x = mouseX/led & (d-1); var y = mouseY/led & (d-1); var i = y * d + x; // create empty field //boolean[] field = new boolean[d*d]; var field = [d*d]; // find all cells in the orbit i0 = d*d; while (!field[i]) { i0 = min(i, i0); field[i] = true; i *= 2; if (i >= d*d ) i ^= p; } // draw display for (i = 0; i < d*d; i++) { if (field[i]) { ellipse(led * (i % d), led * floor(i / d), led, led); } } } function keyPressed() { switch(key) { // switch between presets case ' ': pick = (pick + 1) % preset.length; p = preset[pick]; break; // next pattern case '+': p = (p + 1) | d; break; // previous pattern case '-': p = (p - 1) | d; break; // toggle debugging case 'd': debug = !debug; break; // switch background color case 'b': bg = 255 - bg; break; default: return; } }