31 lines
805 B
Raku
31 lines
805 B
Raku
use Image::PNG::Portable;
|
|
|
|
my ($w, $h) = 400, 400;
|
|
my $out = Image::PNG::Portable.new: :width($w), :height($h);
|
|
|
|
plasma($out);
|
|
|
|
$out.write: 'Plasma-perl6.png';
|
|
|
|
sub plasma ($png) {
|
|
(^$w).race.map: -> $x {
|
|
for ^$h -> $y {
|
|
my $hue = 4 + sin($x / 19) + sin($y / 9) + sin(($x + $y) / 25) + sin(sqrt($x² + $y²) / 8);
|
|
$png.set: $x, $y, |hsv2rgb($hue/8, 1, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
sub hsv2rgb ( $h, $s, $v ){
|
|
my $c = $v * $s;
|
|
my $x = $c * (1 - abs( (($h*6) % 2) - 1 ) );
|
|
my $m = $v - $c;
|
|
(do given $h {
|
|
when 0..^1/6 { $c, $x, 0 }
|
|
when 1/6..^1/3 { $x, $c, 0 }
|
|
when 1/3..^1/2 { 0, $c, $x }
|
|
when 1/2..^2/3 { 0, $x, $c }
|
|
when 2/3..^5/6 { $x, 0, $c }
|
|
when 5/6..1 { $c, 0, $x }
|
|
} ).map: ((*+$m) * 255).Int
|
|
}
|