Death Star: Difference between revisions
Content added Content deleted
(→{{header|Sidef}}: simplified the code to use the Vector class and added link to the output image) |
m (→{{header|REXX}}: added whitespace and comments, used a template for the output section.) |
||
Line 1,428:
=={{header|REXX}}==
{{trans|D}}
(Apologies for the comments making the lines so wide, but it was easier to read and compare to the original '''D''' source.)
<lang rexx>/*REXX program displays a sphere with another sphere subtracted where it's superimposed.*/
call deathStar 2, .5, v3('-50 30 50')
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
Line 1,439 ⟶ 1,440:
v3: procedure; parse arg a b c; #=sqrt(a**2 + b**2 + c**2); return a/# b/# c/#
/*──────────────────────────────────────────────────────────────────────────────────────*/
sqrt: procedure; parse arg x;
m.=9; numeric form;
numeric digits d; return g/1▼
/*──────────────────────────────────────────────────────────────────────────────────────*/
hitSphere: procedure expose !.;
if z<0 then return 0;
/*──────────────────────────────────────────────────────────────────────────────────────*/
deathStar: procedure; parse arg k,ambient,sun /* [↓] display the deathstar to screen*/
parse var sun s1 s2 s3 /*identify the light source coördinates*/
if
else shading= '·:!ºoe@░▒▓' /* "
shadingL= length(shading) /*the number of dithering characters. */
shades.= ' '; do i=1 for shadingL; shades.i= substr(shading, i, 1)
ship= 20 20 0 20 ; parse var ship shipX shipY shipZ shipR
hole= ' 1 1 -6 20' ; parse var hole holeX holeY holeZ .
?=hitSphere(ship, x, y); b1=!.z1; b2=!.z2 /*? is boolean, "true" indicates ray hits the sphere.*/▼
do
x=.5 * (j-shipX+1) + shipX;
▲ ?= hitSphere(ship, x, y);
/*$BG: if 1, its background; if zero, it's foreground.*/
if \? then $bg= 1 /*ray lands in blank space, so draw the background. */
else do; ?= hitSphere(hole, x, y); s1= !.z1; s2= !.z2
if \? then $pos= 1 /*ray hits ship but not the hole, so draw ship surface. */
else if s1>b1 then $pos=1 /*ray hits both, but ship front surface is closer. */
else if s2>b2 then $bg=
else if s2>b1 then $neg=1 /*hole back surface is inside ship; the only place
else $pos=1 /*
end
select
when $bg then do;
when $pos then vec_= v3(x-shipX y-shipY b1-shipZ)
when $neg then vec_= v3(holeX-x holeY-y holeZ-s2)
end /*select*/
b=1 +min(shadingL, max(0, trunc((1 - (dot.(sun, v3(vec_))**k + ambient)) * shadingL)))
@=@ || shades.b /*B
end /*j*/ /* [↑] build a line for the sphere.*/
Line 1,484:
end /*i*/ /* [↑] show all lines for sphere. */
return</lang>
{{out|output|text= when using the internal default input:}}
<pre>
eeeee:::::::
|