Part of the ReCode Project (recodeproject.com)
recodeproject.com/artwork/v3n2untitled-marcus1
Based on "Untitled 1" by Aaron Marcus
Originally published in "Computer Graphics and Art" v3n2, 1978
Copyright (c) 2013 Arnaud Coolsaet - OSI/MIT license
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(-1);
/*
http://recodeproject.com/translation/arnaud-coolsaet-recode-hieroglyphs-direct-untitled-1-aaron-marcus
Part of the ReCode Project (http://recodeproject.com)
Based on "Untitled 1" by Aaron Marcus
Originally published in "Computer Graphics and Art" v3n2, 1978
Copyright (c) 2013 Arnaud Coolsaet - OSI/MIT license (http://recodeproject/license).
*/
// Global code will be evaluated once.
const turtle = new Turtle();
turtle.penup();
let xPosStart, prevEl;
let incrementBoxes = true;
let rowStarted = true;
let rowCount = 25;
let boxIndex = 0.1;
let xPos = 0;
let yPos = 15;
const width = 400;
// set 'random' x-position according to shape & previous shape
const randomX = what => {
if ( rowStarted === true ) {
rowStarted = false;
xPos = 80 + Math.random() * 100;
xPosStart = xPos;
} else {
if ( what === "circle" ) {
xPos += 15;
} else if ( prevEl === "box" || prevEl === "circle" ) {
xPos += 12 + Math.random() * 5;
} else if ( what === "dot" && ( prevEl === "dot" || prevEl === "line" ) ) {
xPos += 7;
} else {
xPos += 2 + Math.random() * 8;
}
}
prevEl = what;
}
const circle = (x, y, r) => {
x *= 0.5;
y *= 0.5;
r *= 0.5;
turtle.goto(x - 100, y - 100 - r / 2);
turtle.down();
turtle.circle(r / 2);
turtle.up();
}
const rect = (x0, y0, w0, h0) => {
x0 *= 0.5;
y0 *= 0.5;
w0 *= 0.5;
h0 *= 0.5;
turtle.goto(x0 - 100, y0 - 100);
turtle.down();
for (let x = x0 - 100; x <= x0 + w0 - 100; x += 0.2 ) {
turtle.goto(x, y0 - 100);
turtle.goto(x, y0 + h0 - 100);
}
turtle.up();
}
const line = (x0, y0, x1, y1) => {
x0 *= 0.5;
y0 *= 0.5;
x1 *= 0.5;
y1 *= 0.5;
turtle.goto(x0 - 100, y0 - 100);
turtle.down();
turtle.goto(x1 - 100, y1 - 100);
turtle.up();
}
const twoTrema = () => {
rect(xPos-1, yPos-2, 0.4, 2);
rect(xPos-3, yPos-2, 0.4, 2);
rect(xPos+7, yPos-2, 0.4, 2);
rect(xPos+9, yPos-2, 0.4, 2);
}
const oneCirc = () => {
line( xPos + 5, yPos-1, xPos+7, yPos-3 );
line( xPos + 7, yPos-3, xPos + 9, yPos-1 );
line( xPos + 5, yPos-1+0.2, xPos+7, yPos-3+0.2 );
line( xPos + 7, yPos-3+0.2, xPos + 9, yPos-1+0.2 );
}
const aCircle = () => {
randomX( "circle" );
circle( xPos, yPos + 5, 8 );
circle( xPos, yPos + 5, 7 );
circle( xPos, yPos + 5, 6 );
}
const aDot = () => {
randomX( "dot" );
rect( xPos, yPos+6, 2, 2 );
}
const aBar = () => {
randomX( "bar" );
const shorter = Math.random() < 0.5 ? 1 : 0;
line( xPos, (yPos + shorter), xPos, (yPos + 12 - (shorter * 3)) );
line( xPos + 0.2, (yPos + shorter), xPos + 0.2, (yPos + 12 - (shorter * 3)) );
}
const aBox = () => {
randomX( "box" );
if ( Math.random() < 0.5 - boxIndex ) {
} else {
const rGlitch = Math.random();
if ( rGlitch < 0.2 ) {
twoTrema();
} else if ( rGlitch > 0.2 && rGlitch < 0.4 ) {
oneCirc();
}
}
rect( xPos+1, yPos+1, 8, 8 );
}
// The walk function will be called until it returns false.
function walk(i) {
const rIndex = Math.random() * 15;
// increment possible range for boxes
if ( incrementBoxes && rIndex >= 0 && rIndex <= boxIndex && boxIndex < 12 ) {
aBox();
boxIndex += Math.random() / 5;
}
// else distribute them through fixed range
else if ( !incrementBoxes && rIndex >= 3 && rIndex <= 6 ) {
aBox();
}
// ranges for other shapes
else if ( rIndex >= 7 && rIndex <= 8 && rowCount < 27 && rowCount > 19 ) {
aCircle();
}
else if ( rIndex >= 9 && rIndex <= 10) {
aDot();
}
else {
aBar();
}
// set new line
if ( xPos >= (width - xPosStart) ) {
rowCount--;
yPos += 15;
rowStarted = true;
}
return rowCount > 0;
}