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 ($rad, $ambient) = (($x - 1)/2, .2);
my ($r, $ambient) = (($x - 1)/2, 0);
my ($r2) = $rad ** 2;
my ($r2) = $r ** 2;
{
{
for my $x (-$rad .. $rad) {
for my $x (-$r .. $r) {
my $x2 = $x**2;
my $x2 = $x**2;
for my $y (-$rad .. $rad) {
for my $y (-$r .. $r) {
my $y2 = $y**2;
my $y2 = $y**2;
my $pixel = 127;
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 = ($light . $v) + $ambient;
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 == $rad ? "\n" : " ";
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;
}
sub normalized {
my $this = shift;
my $norm = sqrt($this . $this);
ref($this)->new( map $_/$norm, @$this );
}
}
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()} };
sub normalized {
my $this = shift;
my $norm = sqrt($this . $this);
bless [ map $_/$norm, @$this ], ref $this;
}
}</lang>
}</lang>