langs a-z
This commit is contained in:
parent
db842d013d
commit
d066446780
11389 changed files with 98361 additions and 1020 deletions
19
Task/Death-Star/Openscad/death-star.scad
Normal file
19
Task/Death-Star/Openscad/death-star.scad
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// We are performing geometric subtraction
|
||||
|
||||
difference() {
|
||||
|
||||
// Create the primary sphere of radius 60 centred at the origin
|
||||
|
||||
translate(v = [0,0,0]) {
|
||||
sphere(60);
|
||||
}
|
||||
|
||||
/*Subtract an overlapping sphere with a radius of 40
|
||||
The resultant hole will be smaller than this, because we only
|
||||
only catch the edge
|
||||
*/
|
||||
|
||||
translate(v = [0,90,0]) {
|
||||
sphere(40);
|
||||
}
|
||||
}
|
||||
17
Task/Death-Star/POV-Ray/death-star.pov-ray
Normal file
17
Task/Death-Star/POV-Ray/death-star.pov-ray
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
camera { perspective location <0.0 , .8 ,-3.0> look_at 0
|
||||
aperture .1 blur_samples 20 variance 1/100000 focal_point 0}
|
||||
|
||||
light_source{< 3,3,-3> color rgb 1}
|
||||
|
||||
sky_sphere { pigment{ color rgb <0,.2,.5>}}
|
||||
|
||||
plane {y,-5 pigment {color rgb .54} normal {hexagon} }
|
||||
|
||||
difference {
|
||||
sphere { 0,1 }
|
||||
sphere { <-1,1,-1>,1 }
|
||||
texture {
|
||||
pigment{ granite }
|
||||
finish { phong 1 reflection {0.10 metallic 0.5} }
|
||||
}
|
||||
}
|
||||
86
Task/Death-Star/Perl-6/death-star.pl6
Normal file
86
Task/Death-Star/Perl-6/death-star.pl6
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
class sphere {
|
||||
has $.cx; # center x coordinate
|
||||
has $.cy; # center y coordinate
|
||||
has $.cz; # center z coordinate
|
||||
has $.r; # radius
|
||||
}
|
||||
|
||||
my $depth = 255; # image color depth
|
||||
|
||||
my $x = my $y = 255; # dimensions of generated .pgm; must be odd
|
||||
|
||||
my $s = ($x - 1)/2; # scaled dimension to build geometry
|
||||
|
||||
my @light = normalize([ 4, -1, -3 ]);
|
||||
|
||||
# positive sphere at origin
|
||||
my $pos = sphere.new(
|
||||
cx => 0,
|
||||
cy => 0,
|
||||
cz => 0,
|
||||
r => $s.Int
|
||||
);
|
||||
|
||||
# negative sphere offset to upper left
|
||||
my $neg = sphere.new(
|
||||
cx => (-$s*.90).Int,
|
||||
cy => (-$s*.90).Int,
|
||||
cz => (-$s*.3).Int,
|
||||
r => ($s*.7).Int
|
||||
);
|
||||
|
||||
sub MAIN ($outfile = 'deathstar-perl6.pgm') {
|
||||
my $out = open( $outfile, :w, :bin ) or die "$!\n";
|
||||
$out.say("P5\n$x $y\n$depth"); # .pgm header
|
||||
say 'Calculating row:';
|
||||
$out.print( draw_ds(3, .15)».chrs );
|
||||
$out.close;
|
||||
}
|
||||
|
||||
sub draw_ds ( $k, $ambient ) {
|
||||
my @pixels;
|
||||
my $bs = "\b" x 8;
|
||||
for ($pos.cy - $pos.r) .. ($pos.cy + $pos.r) -> $y {
|
||||
note $bs, $y, ' '; # monitor progress
|
||||
for ($pos.cx - $pos.r) .. ($pos.cx + $pos.r) -> $x {
|
||||
# black if we don't hit positive sphere, ignore negative sphere
|
||||
if not hit($pos, $x, $y, my $posz) {
|
||||
@pixels.push(0);
|
||||
next;
|
||||
}
|
||||
my @vec;
|
||||
# is front of positive sphere inside negative sphere?
|
||||
if hit($neg, $x, $y, my $negz) and $negz.min < $posz.min < $negz.max {
|
||||
# make black if whole positive sphere eaten here
|
||||
if $negz.min < $posz.max < $negz.max { @pixels.push(0); next; }
|
||||
# render inside of negative sphere
|
||||
@vec = normalize([$neg.cx - $x, $neg.cy - $y, -$negz.max - $neg.cz]);
|
||||
}
|
||||
else {
|
||||
# render outside of positive sphere
|
||||
@vec = normalize([$x - $pos.cx, $y - $pos.cy, $posz.max - $pos.cz]);
|
||||
}
|
||||
my $intensity = dot(@light, @vec) ** $k + $ambient;
|
||||
@pixels.push( ($intensity * $depth).Int min $depth );
|
||||
}
|
||||
}
|
||||
say $bs, 'Writing file.';
|
||||
return @pixels;
|
||||
}
|
||||
|
||||
# normalize a vector
|
||||
sub normalize (@vec) { return @vec »/» ([+] @vec Z* @vec).sqrt }
|
||||
|
||||
# dot product of two vectors
|
||||
sub dot (@x, @y) { return -([+] @x Z* @y) max 0 }
|
||||
|
||||
# are the coordinates within the radius of the sphere?
|
||||
sub hit ($sphere, $x is copy, $y is copy, $z is rw) {
|
||||
$x -= $sphere.cx;
|
||||
$y -= $sphere.cy;
|
||||
my $z2 = $sphere.r * $sphere.r - $x * $x - $y * $y;
|
||||
return 0 if $z2 < 0;
|
||||
$z2 = $z2.sqrt;
|
||||
$z = $sphere.cz - $z2 .. $sphere.cz + $z2;
|
||||
return 1;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue