Voronoi diagram: Difference between revisions

Added Perl example
m (→‎{{header|Perl 6}}: added .race for concurrency, code tweaks)
(Added Perl example)
Line 1,239:
| bgcolor="#C0F0C0" |·|| bgcolor="#C0F0C0" |·|| bgcolor="#C0F0C0" |·|| bgcolor="#C0F0C0" |·||·||·||·||·||·||·
|}
 
=={{header|Perl}}==
{{trans|Perl 6}}
<lang perl>use Imager;
 
my %type = (
Taxicab => sub { my($px, $py, $x, $y) = @_; abs($px - $x) + abs($py - $y) },
Euclidean => sub { my($px, $py, $x, $y) = @_; ($px - $x)**2 + ($py - $y)**2 },
Minkowski => sub { my($px, $py, $x, $y) = @_; abs($px - $x)**3 + abs($py - $y)**3 },
);
 
my($xmax, $ymax) = (400, 400);
 
for (1..30) {
push @domains, {
x => int 5 + rand $xmax-10,
y => int 5 + rand $ymax-10,
rgb => [int rand 255, int rand 255, int rand 255]
}
}
 
for my $type (keys %type) {
our $img = Imager->new(xsize => $xmax, ysize => $ymax, channels => 3);
voronoi($type, $xmax, $ymax, @domains);
dot(1,@domains);
$img->write(file => "voronoi-$type.png");
}
 
sub voronoi {
my($type, $xmax, $ymax, @d) = @_;
for $x (0..$xmax) {
for $y (0..$ymax) {
my $i = 0;
my $d = 10e6;
for (0..$#d) {
my $dd = &{$type{$type}}($d[$_]{'x'}, $d[$_]{'y'}, $x, $y);
if ($dd < $d) { $d = $dd; $i = $_ }
}
$img->setpixel(x => $x, y => $y, color => $d[$i]{rgb} );
}
}
}
 
sub dot {
($radius, @d) = @_;
for (0..$#d) {
$dx = $d[$_]{'x'};
$dy = $d[$_]{'y'};
for $x ($dx-$radius .. $dx+$radius) {
for $y ($dy-$radius .. $dy+$radius) {
$img->setpixel(x => $x, y => $y, color => [0,0,0]);
}
}
}
}</lang>
[https://github.com/SqrtNegInf/Rosettacode-Perl5-Smoke/blob/master/ref/voroni-Euclidean.png Euclidean Voronoi diagram]
 
=={{header|Perl 6}}==
2,392

edits