Bitmap/Midpoint circle algorithm: Difference between revisions

→‎{{header|Raku}}: fix error, DRY, 'clone' not needed, emphasize parallelism, create output
(added Perl programming solution)
(→‎{{header|Raku}}: fix error, DRY, 'clone' not needed, emphasize parallelism, create output)
Line 2,090:
has Pixel @!data;
 
method fill(Pixel $\p) {
@!data = $p.clone xx ($!width* × $!height)
}
method pixel(
$i where ^$!width,
$j where ^$!height
--> Pixel
) is rw { @!data[$i + $j * $!width] }
 
method set-pixel ($ \i, where ^$j!width, Pixel\j where ^$p!height --> Pixel) is rw {
) is rw { @!data[$i +× $j!width *+ $!widthj] }
self.pixel($i, $j) = $p.clone;
}
 
method get-pixel ($i, $j) returns Pixel {
self. method set-pixel ($\i, $\j, Pixel \p); {
self.pixel($i, $j) = $p.clone;
}
 
method get-pixel ($\i, $\j) returns Pixel {
self.set-pixel($x0 - $r, $y0i, $valuej);
}
}
 
augment class Pixel { method Str { "$.R $.G $.B" } }
augment class Bitmap {
method P3 {
join "\n", «P3 "$.width $.height" 255»,
do for ^($.width × $.height) { join ' ', @.!data[]»[$_] }
}
 
method raster-circle ( $x0, $y0, $r, Pixel $value ) {
method raster-circle ( \x0, my\y0, $f\r, =Pixel 1\value -) $r;{
my $ddF_x = 0;
my $ddF_y = -2 *× $r;
my ($x,f $y) = 0, $1 - r;
self.set-pixelmy ($x0x, $y0y) += $r 0, $value) r;
self.setfor flat (0 X 1,-pixel1),($x01,-1 $y0X 0) -> $r\i, $value);\j {
self.set-pixel($x0 + $ri×r, $y0 + j×r, $value);
$x++;}
self.set-pixel($x0 - $r, $y0, $value);
 
while $x < $y {
if($y--; $f >+= 0 { ($ddF_y += 2)) if $f ≥ 0;
$x++; $f += 1 + ($y--ddF_x += 2);
for flat (1,-1) X $ddF_y(1,-1) +=-> 2;\i, \j {
self.set-pixel(x0 + i×$fx, y0 += $ddF_yy, value);
self.set-pixel($x0 + $y, $y0 + $x, $value);
}
$x++;
$ddF_x += 2;
$f += $ddF_x + 1;
self.set-pixel($x0 + $x, $y0 + $y, $value);
self.set-pixel($x0 - $x, $y0 + $y, $value);
self.set-pixel($x0 + $x, $y0 - $y, $value);
self.set-pixel($x0 - $x, $y0 - $y, $value);
self.set-pixel($x0 + $y, $y0 + $x, $value);
self.set-pixel($x0 - $y, $y0 + $x, $value);
self.set-pixel($x0 + $y, $y0 - $x, $value);
self.set-pixel($x0 - $y, $y0 - $x, $value);
}
}
}
}</lang>
 
my Bitmap $b = Bitmap.new( width => 32, height => 32);
$b.fill( Pixel.new( R => 0, G => 0, B => 0) );
$b.raster-circle(16, 16, 15, Pixel.new(R=>0, G=>0, B=>100));
}say $b.P3;</lang>
 
=={{Header|OCaml}}==
2,392

edits