#!/usr/bin/perl use strict; use warnings; use List::Util qw( max min ); my $max = 40; my @aoa = map { [ ( 'o' ) x ($max + 1) ] } 0..$max ; display( @aoa ); # @to_change will contain [y1,x1],[y2,x2]... #my @to_change = illuminate( 5, 4, 6 ); my @to_change = illuminate( $max >> 1, $max >> 1, $max - 2 >> 1 ); print "\n"; $aoa[$_->[0]][$_->[1]] = 'x' for @to_change; display( @aoa ); sub illuminate { my @to_change; my $center_r = shift; my $center_c = shift; my $radius = shift; #... for my $row ( 0 .. $#aoa ) { my $delta_x = eval { int sqrt $radius ** 2 - ($center_r - $row) ** 2 }; if( defined $delta_x ) { my $low = max 0, $center_c - $delta_x; my $high = min $#{ $aoa[$row] }, $center_c + $delta_x; push @to_change, map [ $row, $_ ], $low .. $high; } } return @to_change; } sub display { foreach my $row ( @_ ) { foreach my $col ( @$row ) { print $col; } print "\n" } }