note
Marshall
Thanks for the correction! I guess there is a similar problem in the y direction. I like seeing bug reports like this because it means that somebody actually ran the code! I guess some adjustment of the loop conditional is also possible to not even consider points outside of the input array. <p>
I very seldom use <c>$array[][]</c> syntax because Perl is so cool at working with references to rows. I suppose some tricky splice() statement could be used, but my brain started hurting and I went for something straightforward. Glad to have been of help. <p>
<b>Update:</b>
Here is modified version without extraneous prints and better control over loop condition:
<readmore>
<c>
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/min max/;
my @aoa;
init_grid(\@aoa);
draw_circle (\@aoa,8,9,5.6);
dump_grid(\@aoa);
init_grid(\@aoa);
draw_circle (\@aoa,0,3,5.6);
dump_grid(\@aoa);
init_grid(\@aoa);
draw_circle (\@aoa,-2,3,5.6);
dump_grid(\@aoa);
sub init_grid
{
my $ref_aoa = shift;
my $max = 19; #from OP
@$ref_aoa = map { [ ( 'o' ) x ($max + 1) ] } 0..$max; #from OP
}
sub draw_circle
{
my ($ref_aoa, $circle_x, $circle_y, $radius) = @_;
my $max_x_grid = @{$ref_aoa->[0]};
my $max_xi = $max_x_grid-1; #range 0..$max_xi
my $max_y_grid = @$ref_aoa;
my $max_yi = $max_y_grid-1; #range 0..$max_yi
my $radius_integer = int $radius;
my $top_y_index = max($circle_y + $radius_integer,0);
$top_y_index = min($top_y_index, $max_yi);
my $bottom_y_index = max($circle_y - $radius_integer,0);
my $left_x_index = max($circle_x - $radius_integer,0);
my $right_x_index = max($circle_x + $radius_integer,0);
$right_x_index = min($right_x_index, $max_xi);
# Circle in cartesian coordinates
#(x - a)**2 + (y - b)**2 = r**2 where a and b are the coordinates of the center (a, b) and r is the radius.
for (my $y=$top_y_index ; $y >= $bottom_y_index; $y--)
{
for (my $x=$left_x_index; $x <= $right_x_index; $x++)
{
$ref_aoa->[$max_xi-$x][$y] = 'X' if ( ($x-$circle_x)**2 + ($y-$circle_y)**2 <= ($radius**2) );
}
}
}
sub dump_grid
{
my $ref_aoa = shift;
foreach my $row_ref ( @$ref_aoa)
{
print "@$row_ref\n";
}
print "\n";
}
__END__
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o X X X X X o o o o o o o o
o o o o o o X X X X X X X o o o o o o o
o o o o o X X X X X X X X X o o o o o o
o o o o X X X X X X X X X X X o o o o o
o o o o X X X X X X X X X X X o o o o o
o o o o X X X X X X X X X X X o o o o o
o o o o X X X X X X X X X X X o o o o o
o o o o X X X X X X X X X X X o o o o o
o o o o o X X X X X X X X X o o o o o o
o o o o o o X X X X X X X o o o o o o o
o o o o o o o X X X X X o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o X X X X X o o o o o o o o o o o o o o
X X X X X X X o o o o o o o o o o o o o
X X X X X X X X o o o o o o o o o o o o
X X X X X X X X X o o o o o o o o o o o
X X X X X X X X X o o o o o o o o o o o
X X X X X X X X X o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o
o X X X X X o o o o o o o o o o o o o o
X X X X X X X o o o o o o o o o o o o o
X X X X X X X X o o o o o o o o o o o o
X X X X X X X X X o o o o o o o o o o o
</c>
</readmore>
1231454
1231489