Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
155
Task/Death-Star/Yabasic/death-star.basic
Normal file
155
Task/Death-Star/Yabasic/death-star.basic
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
open window 100,100
|
||||
window origin "cc"
|
||||
backcolor 0,0,0
|
||||
clear window
|
||||
|
||||
tonos = 100
|
||||
interv = int(255 / tonos)
|
||||
dim shades(tonos)
|
||||
|
||||
shades(1) = 255
|
||||
for i = 2 to tonos
|
||||
shades(i) = shades(i-1) - interv
|
||||
next i
|
||||
|
||||
dim light(3)
|
||||
|
||||
light(0) = 30
|
||||
light(1) = 30
|
||||
light(2) = -50
|
||||
|
||||
|
||||
sub normalize(v())
|
||||
local long
|
||||
|
||||
long = sqrt(v(0)*v(0) + v(1)*v(1) + v(2)*v(2))
|
||||
v(0) = v(0) / long
|
||||
v(1) = v(1) / long
|
||||
v(2) = v(2) / long
|
||||
end sub
|
||||
|
||||
|
||||
sub punto(x(), y())
|
||||
local d
|
||||
|
||||
d = x(0)*y(0) + x(1)*y(1) + x(2)*y(2)
|
||||
if d < 0 then
|
||||
return -d
|
||||
else
|
||||
return 0
|
||||
end if
|
||||
end sub
|
||||
|
||||
|
||||
//* positive shpere and negative sphere */
|
||||
dim pos(3)
|
||||
dim neg(3)
|
||||
|
||||
// x, y, z, r
|
||||
|
||||
pos(0) = 10
|
||||
pos(1) = 10
|
||||
pos(2) = 0
|
||||
pos(3) = 20
|
||||
|
||||
neg(0) = 0
|
||||
neg(1) = 0
|
||||
neg(2) = -5
|
||||
neg(3) = 15
|
||||
|
||||
|
||||
sub hit_sphere(sph(), x, y)
|
||||
local zsq
|
||||
|
||||
x = x - sph(0)
|
||||
y = y - sph(1)
|
||||
zsq = sph(3) * sph(3) - (x * x + y * y)
|
||||
if (zsq < 0) then
|
||||
return 0
|
||||
else
|
||||
return sqrt(zsq)
|
||||
end if
|
||||
end sub
|
||||
|
||||
|
||||
sub draw_sphere(k, ambient)
|
||||
local i, j, intensity, hit_result, result, b, vec(3), x, y, zb1, zb2, zs1, zs2, ini1, fin1, ini2, fin2
|
||||
|
||||
ini1 = int(pos(1) - pos(3))
|
||||
fin1 = int(pos(1) + pos(3) + .5)
|
||||
for i = ini1 to fin1
|
||||
y = i + .5
|
||||
ini2 = int(pos(0) - 2 * pos(3))
|
||||
fin2 = int(pos(0) + 2 * pos(3) + .5)
|
||||
for j = ini2 to fin2
|
||||
x = (j - pos(0)) / 2 + .5 + pos(0)
|
||||
|
||||
// ray lands in blank space, draw bg
|
||||
result = hit_sphere(pos(), x, y)
|
||||
|
||||
if not result then
|
||||
hit_result = 0
|
||||
|
||||
//* ray hits pos sphere but not neg, draw pos sphere surface */
|
||||
else
|
||||
zb1 = pos(2) - result
|
||||
zb2 = pos(2) + result
|
||||
result = hit_sphere(neg(), x, y)
|
||||
if not result then
|
||||
hit_result = 1
|
||||
else
|
||||
zs1 = neg(2) - result
|
||||
zs2 = neg(2) + result
|
||||
if (zs1 > zb1) then
|
||||
hit_result = 1
|
||||
elseif (zs2 > zb2) then
|
||||
hit_result = 0
|
||||
elseif (zs2 > zb1) then
|
||||
hit_result = 2
|
||||
else
|
||||
hit_result = 1
|
||||
end if
|
||||
end if
|
||||
end if
|
||||
|
||||
if not hit_result then
|
||||
color 0,0,0
|
||||
dot x, y
|
||||
else
|
||||
switch(hit_result)
|
||||
case 1:
|
||||
vec(0) = x - pos(0)
|
||||
vec(1) = y - pos(1)
|
||||
vec(2) = zb1 - pos(2)
|
||||
break
|
||||
default:
|
||||
vec(0) = neg(0) - x
|
||||
vec(1) = neg(1) - y
|
||||
vec(2) = neg(2) - zs2
|
||||
end switch
|
||||
|
||||
normalize(vec())
|
||||
b = (punto(light(), vec())^k) + ambient
|
||||
intensity = (1 - b) * tonos
|
||||
if (intensity < 1) intensity = 1
|
||||
if (intensity > tonos) intensity = tonos
|
||||
color shades(intensity),shades(intensity),shades(intensity)
|
||||
dot x,y
|
||||
end if
|
||||
next j
|
||||
next i
|
||||
end sub
|
||||
|
||||
|
||||
ang = 0
|
||||
|
||||
while(true)
|
||||
//clear window
|
||||
light(1) = cos(ang * 2)
|
||||
light(2) = cos(ang)
|
||||
light(0) = sin(ang)
|
||||
normalize(light())
|
||||
ang = ang + .05
|
||||
|
||||
draw_sphere(2, .3)
|
||||
wend
|
||||
Loading…
Add table
Add a link
Reference in a new issue