Concept:
In the first week of classes, I decided to make a self-avoiding walker with randomized RGB colors for the background, lines, and points of the walker and Gaussian random point size. I took this assignment to review my prior knowledge of P5Js and build upon it. For the point, I made sure I used noise to randomize the color to make it more organic, playfull, and aesthetically pleasing.
Highlight of some code:
To successfully make this project, I had to research a little about self-avoiding walkers, and I came across the Coding Trian video where he transforms the random walker we made in class into a self-avoiding one. For my code, I followed the same logic as he did but I also added my own into it. I also explored noise and Gaussian random a lot in this assignment. I also decided to add some text indicating that the pattern has stopped so that the user can reload the code if they want another pattern.
// global variable to store the data in the left right up and dawn, each objects stores an element of direction
let allDirections = [
{ dx: 1, dy: 0 }, //right
{ dx: -1, dy: 0 }, //left
{ dx: 0, dy: 1 }, //dawn
{ dx: 0, dy: -1 }, //up
];
let x;
let y;
// randomize the color of stokes
let Clr = 0;
let grid;
let spacing = 20;
let cols, rows; //variables for the colombs and rows to store info
//
function GridArray(cols, rows) {
let arr = new Array(cols);
for (let i = 0; i < arr.length; i++) {
arr[i] = new Array(rows);
}
return arr;
}
function setup() {
createCanvas(400, 400);
//colums and raws for the 2d array
cols = floor(width / spacing);
rows = floor(height / spacing);
x = cols / 2;
y = rows / 2;
//random Background color
r = random(200, 160);
g = random(200, 160);
b = random(200, 160);
background(r, g, b);
//make an array to store the grid data in to save it and set it intially to false if it did not go there
grid = GridArray(cols, rows);
for (let i = 0; i < cols; i++) {
for (let j = 0; j < rows; j++) {
grid[i][j] = false;
}
}
// set to true when walker has been there
grid[x][y] = true;
}
//create a function to check validity to go to a specific spot
function isValid(i, j) {
if (i < 0 || i >= cols || j < 0 || j >= rows) {
return false;
}
return !grid[i][j];
}
function draw() {
// make dot size based on random gaussian
let w = randomGaussian(8, 4);
strokeWeight(w);
// make stroke color based on noise
let n = noise(Clr);
let n2 = noise(Clr + 80);
let n3 = noise(Clr + 50);
Clr += 0.75;
let c1 = map(n, 0, 1, 0, 255);
let c2 = map(n2, 0, 1, 0, 255);
let c3 = map(n3, 0, 1, 0, 255);
let c = color(c1, c2, 160 + c3);
//plot the point
stroke(c);
point(x * spacing, y * spacing);
//make array and put all directions in the array then check if its valid
let options = [];
for (let option of allDirections) {
let newX = x + option.dx;
let newY = y + option.dy;
if (isValid(newX, newY)) {
options.push(option);
}
}
if (options.length > 0) {
let step = random(options);
strokeWeight(5);
stroke(c);
beginShape();
// line
vertex(x * spacing, y * spacing);
x += step.dx;
y += step.dy;
vertex(x * spacing, y * spacing);
endShape();
grid[x][y] = true;
} else {
console.log(`Walked this path!`);
textSize(14);
fill(255);
text('OOPS... almost walked on myself',100,200)
noLoop();
}
}
One part of the code I am particularly proud of is making the color for the stroke. Here, I created 3 Perlin noise variables. Then, I incremented Clr by 0.75 to ensure a smooth and gradual transition in color. Then, I mapped the noise values to the color ones understood by P5. Finally, when I made the variable c for color, I made sure that the blue color was more dominant by adding 160 to it.
Embedded sketch:
Reflection and ideas for future work or improvements:
I am really happy with the outcome. This assignment was an opportunity to review what I previously learned in P5Js and add new knowledge to it. However, I think there is always room for improvement. For instance, I need to figure out how to restrict the walker within the canvas boundaries. Further, I want it to be a little more interactive. For instance, if the mouse is pressed or the space bar is clicked, I want the walker to re-load and then make another randomized walker and change colors.
Resources:
Wikipedia contributors. (2024, August 7). Self-avoiding walk. Wikipedia. https://en.wikipedia.org/wiki/Self-avoiding_walk
1.1 What is a Vector? (n.d.). https://thecodingtrain.com/tracks/the-nature-of-code-2/noc/1-vectors/1-what-is-a-vector
The Coding Train. (2021, June 10). Coding Challenge 162: Self-Avoiding Walk [Video]. YouTube. https://www.youtube.com/watch?v=m6-cm6GZ1iw