#!/usr/bin/ruby

#
## https://rosettacode.org/wiki/Plasma_effect
#

require('Imager')

class Plasma(width=400, height=400) {

    has img = nil

    method init {
        img = %O|Imager|.new(xsize => width, ysize => height)
    }

    method generate {
        for y=(^height), x=(^width) {
            var hue = (4 + sin(x/19f) + sin(y/9f) + sin((x+y)/25f) + sin(hypot(x, y)/8f))
            img.setpixel(x => x, y => y, color => Hash(hsv => [360 * hue / 8f, 1, 1]))
        }
    }

    method save_as(filename) {
        img.write(file => filename)
    }
}

var plasma = Plasma(256, 256)
plasma.generate
plasma.save_as('plasma.png')
