this.incrementBy = Math.max(getRandomInt(5), 0.5);
setCurrentDegrees(moveToDegrees) {
this.currentDegree = moveToDegrees;
return this.currentDegree;
this.currentDegree += this.incrementBy;
if (this.currentDegree > this.endDegree) {
this.currentDegree -= this.endDegree
return this.currentDegree;
this.degrees = getRandomInt(360);
colorMode(HSB, 360, 100, 100);
this.degrees = (this.degrees + 0.06) % 360;
let s = 20 * noise(this.t) + 80;
let b = 20 * noise(this.t + 1) + 80;
function computePosition(degrees, distance) {
let radians = degrees * (Math.PI / 180);
let x = distance * Math.cos(radians);
let y = distance * Math.sin(radians);
function plotLine(lineEnd) {
line(0, 0, lineEnd.x, lineEnd.y);
function getRandomInt(max) {
return Math.floor(Math.random() * max);
let innerOffset = getRandomInt(50);
let middleOffset = getRandomInt(50);
let outerOffset = getRandomInt(50);
createCanvas(windowWidth, windowHeight);
colorShift = new ColorShift();
circleLooperInner = new CircleLooper();
circleLooperMiddle = new CircleLooper();
circleLooperOuter = new CircleLooper();
circleLooperInner.setCurrentDegrees(random360());
circleLooperMiddle.setCurrentDegrees(random360());
circleLooperOuter.setCurrentDegrees(random360());
middleCx = getRandomInt(innerCx * 1.5) + 0.5 * innerCx;
middleCy = getRandomInt(innerCy * 1.5) + 0.5 * innerCy;
outerCx = getRandomInt(innerCx * 1.8) + 0.2 * innerCx;
outerCy = getRandomInt(innerCy * 1.8) + 0.2 * innerCy;
function drawLine(translateX, translateY, position ) {
translate(translateX, translateY);
translate(-translateX, -translateY);
let hsb = colorShift.next();
stroke(hsb.h, hsb.s, hsb.b);
drawLine(innerCx, innerCy, computePosition(circleLooperInner.next(), innerCy + innerOffset) );
translate(middleCx, middleCy);
plotLine(computePosition(circleLooperMiddle.next(), innerCx + middleOffset));
translate(-middleCx, -middleCy);
translate(outerCx, outerCy);
plotLine(computePosition(circleLooperOuter.next(), innerCy + outerOffset));
save("more_moire_dbbear.com.png");