Alexander Deplov

Spirograph v3

Spirograph v3

Code

var bg = new Path.Rectangle({
    size: view.bounds,
    fillColor: 'black',
    position: view.center
})
var clones = 8
var angle = 360 / clones
var radialGroupOfObjects = new Group()
var borderCircle = new Path.Circle(view.center, 115)
borderCircle.strokeColor = 'darkblue'
borderCircle.strokeWidth = 0.2
borderCircle.opacity = 0
var centerCircle = new Path.Circle({
    radius: 25,
    fillColor: 'blue',
    position: view.center
})
for (var i = 0; i < clones; i++) {
    var path = new Path.Rectangle({
        size: 5,
        radius: 5,
        fillColor: 'blue',
        position: view.center + [0, 120],
        opacity: 1,
        applyMatrix: false
    })
    path.rotate(angle * i, view.center)
    radialGroupOfObjects.addChild(path)
}
var obj1, obj2;
var objectsGroup = new Group()
var objectsAround = new Group()

function onFrame(event) {
    radialGroupOfObjects.rotate(1)
    objectsGroup.rotate(-0.03)
    radialGroupOfObjects.position.x = view.center.x + Math.cos(event.count * 0.04) * 50
    radialGroupOfObjects.position.y = view.center.y + Math.sin(event.count * 0.04) * 50
    obj1 = new Path.Circle(view.center, 10)
    obj1.fillColor = 'red'
    obj1.scaling += 2 + 1.5 * Math.sin(event.count * 0.1)
    objectsGroup.addChild(obj1)
    obj1.onFrame = function(event) {
        this.fillColor.hue -= 0.3
    }
    obj2 = new Path.Circle(view.center, 15)
    obj2.strokeColor = 'red'
    obj2.scaling += 2 + 1.5 * Math.sin(event.count * 0.1)
    obj2.opacity = 0.3
    objectsAround.addChild(obj2)
    obj2.onFrame = function(event) {
        this.strokeColor.hue -= 0.6
    }
    for (var i = 0; i < radialGroupOfObjects.children.length; i++) {
        var object = radialGroupOfObjects.children[i]
        obj1.position = object.position
        obj1.fillColor.hue -= event.count * 0.3
        obj2.position = object.position
        obj2.strokeColor.hue -= event.count * 0.3 - 40
        if (obj1.fillColor.hue % 10 == 0) {
            var rand = Math.floor(Math.random() * radialGroupOfObjects.children.length)
            radialGroupOfObjects.children[rand].fillColor = obj1.fillColor
            radialGroupOfObjects.children[rand].scaling = rand
        } else {
            var rand = Math.floor(Math.random() * radialGroupOfObjects.children.length)
            radialGroupOfObjects.children[rand].fillColor = 'black'
        }
    }
    centerCircle.position = obj1.position
    centerCircle.fillColor.hue = obj1.fillColor.hue - 5
    centerCircle.bringToFront()
    if (objectsGroup.children.length > 150) {
        objectsGroup.children[0].remove()
        objectsAround.children[0].remove()
    }
}

radialGroupOfObjects.scale(1.2)