Draw a sphere: Difference between revisions
Content added Content deleted
(Perl entry) |
m (→{{header|Perl}}: minor changes) |
||
Line 1,397: | Line 1,397: | ||
print "P2\n$x $y\n$depth\n"; |
print "P2\n$x $y\n$depth\n"; |
||
my ($ |
my ($r, $ambient) = (($x - 1)/2, 0); |
||
my ($r2) = $ |
my ($r2) = $r ** 2; |
||
{ |
{ |
||
for my $x (-$ |
for my $x (-$r .. $r) { |
||
my $x2 = $x**2; |
my $x2 = $x**2; |
||
for my $y (-$ |
for my $y (-$r .. $r) { |
||
my $y2 = $y**2; |
my $y2 = $y**2; |
||
my $pixel = |
my $pixel = 0; |
||
if ($x2 + $y2 < $r2) { |
if ($x2 + $y2 < $r2) { |
||
my $v = Vector->new($x, $y, sqrt($r2 - $x2 - $y2))->normalized; |
my $v = Vector->new($x, $y, sqrt($r2 - $x2 - $y2))->normalized; |
||
my $I = |
my $I = $light . $v + $ambient; |
||
$I = $I < 0 ? 0 : $I > 1 ? 1 : $I; |
$I = $I < 0 ? 0 : $I > 1 ? 1 : $I; |
||
$pixel = int($I * $depth); |
$pixel = int($I * $depth); |
||
} |
} |
||
print $pixel; |
print $pixel; |
||
print $y == $ |
print $y == $r ? "\n" : " "; |
||
} |
} |
||
} |
} |
||
Line 1,421: | Line 1,421: | ||
my $class = shift; |
my $class = shift; |
||
bless ref($_[0]) eq 'Array' ? $_[0] : [ @_ ], $class; |
bless ref($_[0]) eq 'Array' ? $_[0] : [ @_ ], $class; |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
} |
||
use overload q{.} => sub { |
use overload q{.} => sub { |
||
my ($a, $b) = @_; |
my ($a, $b) = @_; |
||
die "wrong type" unless ref($b) eq __PACKAGE__; |
|||
my $sum = 0; |
my $sum = 0; |
||
for (0 .. @$a - 1) { |
for (0 .. @$a - 1) { |
||
Line 1,431: | Line 1,437: | ||
}, |
}, |
||
q{""} => sub { sprintf "Vector:[%s]", join ' ', @{shift()} }; |
q{""} => sub { sprintf "Vector:[%s]", join ' ', @{shift()} }; |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
}</lang> |
}</lang> |
||