Molnar “Searching for Paul Klee” Observations:
- The piece is a grid of many squares
- The squares have different things happening inside of them
- Sometimes there are sub-rectangles, sub-squares, or sub-triangles within these squares, but never any other subdivisions
- There are only diagonal lines drawn with differing densities
- These diagonal lines are oriented in different directions
- There are also implied curves due to the fact that some of these diagonal lines will vary angles within a subspace
- Nearly all of the time there are 2 sub rectangles at differing orientations within a cell
- However, there are also (not… infrequently) triangles composing half a rectangle (these also often come in pairs).
- There are sometimes other triangles, like those which occupy half a square and those which are a fourth of the square, but in a different orientation
- Often, these half-rectangle triangles meet in the middle. I didn’t code this super well
I made the actual SVG way too big (~20 MB) to upload to WordPress, so here is the link to download it from Drive.
Here is an (almost) full pixel screenshot:
Here is a close up pixel screenshot:
I actually probably spent more time on this than my line walk (oops). I found it to be a really engaging exercise! I only wrote about 6 observations before getting bored and starting the code, and during the programming process I made way more minute observations than I did while just looking at it (my ten listed observations don’t encapsulate the full extent of everything I observed and implemented). Here is my code:
// Uses https://github.com/zenozeng/p5.js-svg to export SVG.
// noprotect
function setup() {
createCanvas(816*4, 1056*4, SVG);
noLoop();
}
function makeSubsection(x1, y1, pixelDim, rot, type) {
var x2 = 0;
var y2 = 0;
if (rot == 0) {
//top
x2 = x1 + pixelDim;
y2 = y1 + pixelDim/2;
}
else if (rot == 1) {
//bottom
x2 = x1 + pixelDim;
y1 += pixelDim/2;
y2 = y1 + pixelDim/2;
}
else if (rot == 2) {
//left
x2 = x1 + pixelDim/2;
y2 = y1 + pixelDim;
}
else if (rot == 3) {
//right
x1 += pixelDim/2;
x2 = x1 + pixelDim/2;
y2 = y1 + pixelDim;
}
var density = Math.floor(Math.pow(Math.random(), 1) * 12);
var xMargin = (x2-x1+1)/density;
var yMargin = (y2-y1+1)/density;
if (type < .75) { //half rectangle
var direction = Math.floor(Math.random()*2);
// console.log(rot);
// console.log(x1, y1, x2, y2);
if (direction == 0) {
for (var i = x1; i < x2; i+=xMargin) {
for (var j = y1; j < y2; j+=yMargin) { line(i, j, i+xMargin, j+yMargin); } } } else { for (var i = x2; i > x1; i-=xMargin) {
for (var j = y1; j < y2; j+=yMargin) {
line(i, j, i-xMargin, j+yMargin);
}
}
}
if (rot == 3 && Math.random() < 0.1) {
x1 -= pixelDim/2;
y2 -= pixelDim/2;
xMargin = (x2-x1+1)/density;
yMargin = (y2-y1+1)/density;
for (var n = 0; n < density; n++) {
line(x1+n*xMargin, y1, x2-pixelDim/2, y1+(n+1)*yMargin)
}
x1 += pixelDim/2;
x2 += pixelDim/2;
for (var n = 0; n < density; n++) {
line(x1+n*xMargin, y2, x2-pixelDim/2, y1+(n-1)*yMargin)
}
}
}
else if (type < .9) { //half triangle in half rectangle
var direction = Math.floor(Math.random()*4);
if (direction == 0) {
for (var n = 0; n < density; n++) {
//upper-right
line(x1+n*xMargin, y1, x2, y2-n*yMargin);
}
}
else if (direction == 1) {
for (var n = 0; n < density; n++) {
//lower-right
line(x1+n*xMargin, y2, x2, y1+n*yMargin);
}
}
else if (direction == 2) {
for (var n = 0; n < density; n++) {
//lower-left
line(x1, y1+n*yMargin, x2-n*xMargin, y2);
}
}
else if (direction == 3) {
for (var n = 0; n < density; n++) {
//upper-left
line(x2-n*xMargin, y1, x1, y2-n*yMargin);
}
}
}
else if (type < 1) {
if (rot == 0) {
for (var n = 0; n < density; n++) {
//top
line(x1+n*xMargin, y1, x2-pixelDim/2+n*xMargin/2, y2-n*yMargin);
}
}
else if (rot == 1) {
for (var n = 0; n < density; n++) {
//bottom
line(x1+n*xMargin, y2, x2-pixelDim/2+n*xMargin/2, y1+n*yMargin);
}
}
else if (rot == 2) {
for (var n = 0; n < density; n++) {
//left
line(x1, y1+n*yMargin, x2-n*xMargin, y2-pixelDim/2+n*yMargin/2);
}
}
else if (rot == 3) {
for (var n = 0; n < density; n++) {
//right
line(x2, y1+n*yMargin, x1+n*xMargin, y2-pixelDim/2+n*yMargin/2);
}
}
}
}
function draw() {
var squaresWide = 8.5*4;
var squaresHigh = 11*4;
var pixelDim = width/squaresWide;
for (var x = 0; x < squaresHigh; x++) {
for (var y = 0; y < squaresWide; y++) {
var rot1 = Math.floor(Math.random() * 4);
var rot2 = (rot1 + Math.floor(Math.random() * 3) + 1)%4;
console.log(rot1, rot2);
var type = (Math.random());
makeSubsection(x*pixelDim, y*pixelDim, pixelDim, rot1, type);
makeSubsection(x*pixelDim, y*pixelDim, pixelDim, rot2, type);
}
}
// saveSVG("molnar_redraw_v3.svg");
}