This project explores a unique blend of randomness and user interaction through a dynamic color random walk. The random walker is designed with two key features that make its movement and visual output both unpredictable and engaging.
Key Features:
- Biased Random Movement:
- The random walk incorporates a 40% probability of moving towards the direction of the user’s mouse, introducing an element of interactivity. The remaining 60% of the time, the walker moves in a random direction. However, this randomness is also biased; the walker does not have an equal probability of moving left, right, up, or down, which introduces subtle variations in the walker’s path and adds complexity to its movement.
- Dynamic Color Evolution:
- The visual aspect of the walker’s path is enhanced by a dynamic color mapping that evolves as the walker moves across the canvas. The color of each point is determined by its
xcoordinate, creating a spectrum of hues that shift horizontally across the canvas. Simultaneously, the brightness of each point is mapped to theycoordinate, resulting in a gradient that changes vertically. This color evolution adds a rich, visual narrative to the walker’s journey.
- The visual aspect of the walker’s path is enhanced by a dynamic color mapping that evolves as the walker moves across the canvas. The color of each point is determined by its
- Spatial Harmony:
- To ensure the visual clarity of the path, the walker only draws a point if it has moved a minimum distance from its previous position. This spacing prevents the points from overlapping, creating a more aesthetically pleasing and well-defined pattern.
Code
let walker;
let stepSize = 8;
let minDistance = 30;
function setup() {
createCanvas(600, 600);
walker = new ColorWalker();
background(0);
}
function draw() {
walker.step();
walker.render();
}
class ColorWalker {
constructor() {
this.x = width / 2;
this.y = height / 2;
this.prevX = this.x;
this.prevY = this.y;
}
step() {
let direction = random(1) < 0.3 ? 0 : 1;
let moveX = 0;
let moveY = 0;
if (direction === 0) {
if (mouseX > this.x) {
moveX = stepSize;
} else if (mouseX < this.x) {
moveX = -stepSize;
}
if (mouseY > this.y) {
moveY = stepSize;
} else if (mouseY < this.y) {
moveY = -stepSize;
}
}
else {
let choice = random(1);
if (choice <= 0.4) {
moveX = stepSize;
} else if (choice <= 0.6) {
moveX = -stepSize;
} else if (choice <= 0.8) {
moveY = stepSize;
} else {
moveY = -stepSize;
}
}
this.x += moveX;
this.y += moveY;
this.x = constrain(this.x, 0, width - 1);
this.y = constrain(this.y, 0, height - 1);
}
render() {
let distance = dist(this.x, this.y, this.prevX, this.prevY);
if (distance > minDistance) {
let hue = map(this.x, 0, width, 0, 360);
let brightness = map(this.y, 0, height, 100, 50);
colorMode(HSB, 360, 100, 100);
strokeWeight(15);
stroke(hue, 100, brightness);
strokeWeight(15);
point(this.x, this.y);
this.prevX = this.x;
this.prevY = this.y;
}
}
}
Potential Improvements
I want to make this walker a self-avoiding one I think that would be interesting visualization.