- the piece is composed mostly of diagonals across rectangles
- the rectangles are 1:2
- there are no squares
- most diagonal sections are parallel lines spaced equally apart
- here are some exceptions



- (I was lazy and did not implement these)
- As seen in image one the middle line is thicker than the neighbouring ones in part probably due to rounding errors
- Some of the diagonals across rectangles fill up to the half the space
- the space between the lines selected per rectangle
- The code was potentially run twice as the rectangles overlap
- there are multiple orientations for the lines. They either run left top to right bottom or right top corner to left bottom corner
here’s what I generated

My work I feel is sort of close to the artists. However, I didn’t implement those small exceptions because I was lazy and tired. This work was hard to make because it took me a while just to generate the individual component of a random rectangle section and on top of that the math to produce the diagonals within it. Easily took me 5 hours because of that.
My code
https://editor.p5js.org/miniverse/sketches/gV2HWWueA
/* export SVG
DDF 2019
need to have p5.svg.js in project and in index.html
see -https://github.com/zenozeng/p5.js-svg
this will save an SVG file in your download folder
*/
function setup() {
createCanvas(800, 800, SVG);
strokeWeight(1); // do 0.1 for laser
stroke(0, 0, 0); // red is good for laser
nSquares = 20;
strokeWeight(0.4)
noFill(); // better not to have a fill for laser
}
function distance(x1, y1, x2, y2){
return (y1 - y2)*(y1 - y2) + (x1 - x2)*(x1 - x2)
}
function fillSquare(squareW, startX,startY, box1, box2, percentOptions){
orientation = random([0, 1])
percent = random(percentOptions)
threshold = squareW * 7 * percent;
if(orientation){
point1 = [(box1[0] * squareW) + startX, (box1[1] * squareW) +startY]
point2 = [(box2[0] * squareW) + startX, (box2[1] * squareW) +startY]
spacingX = abs(point1[0] - point2[0]) * percent;
spacingY = abs(point1[1] - point2[1]) * percent;
if(random() < 0.7){ while(distance(point1[0], point1[1], point2[0], point2[1]) > threshold ){
line( point1[0], point1[1], point2[0], point2[1]);
point1 = [point1[0] + spacingX, point1[1]]
point2 = [point2[0], point2[1] - spacingY]
}
}
point1 = [(box1[0] * squareW) + startX, (box1[1] * squareW) +startY]
point2 = [(box2[0] * squareW) + startX, (box2[1] * squareW) +startY]
if(random() < 0.9){ while(distance(point1[0], point1[1], point2[0], point2[1]) > threshold ){
point1 = [point1[0], point1[1] + spacingY]
point2 = [point2[0] - spacingX, point2[1]]
line( point1[0], point1[1], point2[0], point2[1]);
}
}
return;
}
point1 = [(box2[0] * squareW) + startX, (box1[1] * squareW) +startY]
point2 = [(box1[0] * squareW) + startX, (box2[1] * squareW) +startY]
spacingX = abs(point1[0] - point2[0]) * percent;
spacingY = abs(point1[1] - point2[1]) * percent;
while(distance(point1[0], point1[1], point2[0], point2[1]) > threshold ){
line( point1[0], point1[1], point2[0], point2[1]);
point1 = [point1[0] - spacingX, point1[1]]
point2 = [point2[0], point2[1] - spacingY]
}
point1 = [(box2[0] * squareW) + startX, (box1[1] * squareW) +startY]
point2 = [(box1[0] * squareW) + startX, (box2[1] * squareW) +startY]
if(random() < 0.7){ while(distance(point1[0], point1[1], point2[0], point2[1]) > threshold ){
point1 = [point1[0], point1[1] + spacingY]
point2 = [point2[0] + spacingX, point2[1]]
line( point1[0], point1[1], point2[0], point2[1]);
}
}
}
function makeGrid(percentOptions){
squareW = width / nSquares;
for (var r = 0; r < nSquares; r++ ) {
for (var c = 0; c < nSquares; c++) {
box1 = random([[0, 0.0, 0.0], [1, 0.5, 0.0], [2, 0, 0.5]])
if(box1[0] == 0){
box2 = random([[ 1.0, 0.5], [0.5, 1.0]])
}
if(box1[0] == 1 || box1[0] == 2){
box2 = [1.0, 1.0]
}
box1 = [box1[1], box1[2]]
fillSquare(squareW, r * squareW, c * squareW, box1, box2, percentOptions);
}
}
}
function draw() {
makeGrid([0.1, 0.2, 0.5]);
makeGrid([0.1, 0.2, 0.5]);
makeGrid([ 0.2, 0.5]);
save("mySVG.svg"); // give file name
print("saved svg");
noLoop(); // we just want to export once
}