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
x
coordinate, creating a spectrum of hues that shift horizontally across the canvas. Simultaneously, the brightness of each point is mapped to they
coordinate, 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.