Death Star: Difference between revisions
Content added Content deleted
(Maple Version) |
(→{{header|Sidef}}: simplified the code to use the Vector class and added link to the output image) |
||
Line 1,600: | Line 1,600: | ||
{{trans|Perl}} |
{{trans|Perl}} |
||
Writes a PGM to stdout. |
Writes a PGM to stdout. |
||
<lang ruby>func |
<lang ruby>func hitf(sph, x, y) { |
||
x -= sph[0] |
|||
⚫ | |||
} |
|||
var z = (sph[3]**2 - (x**2 + y**2)) |
|||
x -= sph[0]; |
|||
⚫ | |||
z < 0 && return nil |
|||
z < 0 && return nil; |
|||
z.sqrt! |
z.sqrt! |
||
[sph[2] - z, sph[2] + z] |
[sph[2] - z, sph[2] + z] |
||
} |
} |
||
func normalize(v) { |
func normalize(v) { |
||
v / v.abs |
|||
v »/» n; |
|||
} |
} |
||
func dot(x, y) { |
func dot(x, y) { |
||
max(0, x*y) |
|||
s > 0 ? s : 0; |
|||
} |
} |
||
var pos = [120, 120, 0, 120] |
var pos = [120, 120, 0, 120] |
||
var neg = [-77, -33, -100, 190] |
var neg = [-77, -33, -100, 190] |
||
var light = normalize( |
var light = normalize(Vector(-12, 13, -10)) |
||
func draw(k, amb) { |
func draw(k, amb) { |
||
STDOUT.binmode(':raw') |
STDOUT.binmode(':raw') |
||
print ("P5\n", pos[0]*2 + 3, " ", pos[1]*2 + 3, "\n255\n") |
print ("P5\n", pos[0]*2 + 3, " ", pos[1]*2 + 3, "\n255\n") |
||
for y in ((pos[1] - pos[3] - 1) .. (pos[1] + pos[3] + 1)) { |
for y in ((pos[1] - pos[3] - 1) .. (pos[1] + pos[3] + 1)) { |
||
var row = [] |
var row = [] |
||
for x in ((pos[0] - pos[3] - 1) .. (pos[0] + pos[3] + 1)) { |
for x in ((pos[0] - pos[3] - 1) .. (pos[0] + pos[3] + 1)) { |
||
⚫ | |||
var |
var hit = 0 |
||
var |
var hs = [] |
||
⚫ | |||
if (!h) { hit = 0; h = [0, 0] } |
if (!h) { hit = 0; h = [0, 0] } |
||
Line 1,644: | Line 1,640: | ||
elsif (hs[0] > h[0]) { hit = 1 } |
elsif (hs[0] > h[0]) { hit = 1 } |
||
elsif (hs[1] > h[0]) { hit = (hs[1] > h[1] ? 0 : 2) } |
elsif (hs[1] > h[0]) { hit = (hs[1] > h[1] ? 0 : 2) } |
||
else { hit = 1 } |
else { hit = 1 } |
||
⚫ | |||
⚫ | |||
given(hit) { |
given(hit) { |
||
when (0) { val = 0} |
when (0) { val = 0} |
||
when (1) { v = |
when (1) { v = Vector(x-pos[0], y-pos[1], h[0]-pos[2]) } |
||
default { v = |
default { v = Vector(neg[0]-x, neg[1]-y, neg[2]-hs[1]) } |
||
} |
} |
||
if (v) { |
if (defined(v)) { |
||
v = normalize(v) |
v = normalize(v) |
||
val = int((dot(v, light)**k + amb) * 255) |
val = int((dot(v, light)**k + amb) * 255) |
||
val = (val > 255 ? 255 : (val < 0 ? 0 : val)) |
val = (val > 255 ? 255 : (val < 0 ? 0 : val)) |
||
} |
} |
||
row.append(val) |
row.append(val) |
||
} |
} |
||
print 'C*'.pack(row...) |
print 'C*'.pack(row...) |
||
} |
} |
||
} |
} |
||
draw(2, 0.2) |
draw(2, 0.2)</lang> |
||
Output image: [https://github.com/trizen/rc/blob/master/img/death_star_sidef.png here]. |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |