random-walk

This is random-walk

by tomonari takahashi

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/p5.js/0.3.3/p5.min.js"></script>

JavaScript

var koku;
var normal;

function makeKokuRandom(from, to) {
    return (random(from, to) + random(from, to) + random(from, to) + random(from, to) + random(from, to)) / 5;
}

function makeRandom(from, to) {
	return random(from, to);
}

function setup() {
    createCanvas(500, 300);
    koku = new Walker(width, height, makeKokuRandom);
    normal = new Walker(width, height, makeRandom);
    frameRate(60);
}

function draw() {
    background(50);
    koku.run();
    normal.run();
}

var Walker = function(wWidth, wHeight, randomFunc) {
	this.lineLength = 20;
	this.makeRandom = randomFunc;
    this.wWidth = wWidth;
    this.wHeight = wHeight;
    this.v = 0;
    this.r = 0;
    this.x = [];
    this.y = [];
    
    var initPositionX = randomFunc(0, wWidth);
    var initPositionY = randomFunc(0, wHeight);
    
    for (var i = 0; i < this.lineLength; i++) {
    	this.x[i] = initPositionX;
        this.y[i] = initPositionY;
    }
};

Walker.prototype.run = function() {
    
    var prevX = this.x[this.lineLength - 1];
    var prevY = this.y[this.lineLength - 1];  
    
	for (var i = 1; i < this.lineLength; i ++) {
    	this.x[i - 1] = this.x[i];
        this.y[i - 1] = this.y[i];
    }
    
    this.v += 2;
    this.v *= this.makeRandom(-5, 5);
    this.r += this.makeRandom(-6, 6);
    
    var vx = Math.cos(this.r) * this.v;
    var vy = Math.sin(this.r) * this.v;
    this.x[this.lineLength - 1] = prevX + vx;
    this.y[this.lineLength - 1] = prevY + vy;

    this.x[this.lineLength - 1] = constrain(this.x[this.lineLength - 1], 0, this.wWidth);
    this.y[this.lineLength - 1] = constrain(this.y[this.lineLength - 1], 0, this.wHeight);

    for (var j = 0; j < this.lineLength; j += 1) {
        noFill();
        var val = j / this.lineLength * 155 + 100;
        stroke(val);
        curve(this.x[j - 3], this.y[j - 3], this.x[j - 2], this.y[j - 2], this.x[j - 1], this.y[j - 1], this.x[j], this.y[j]);
    }
};