UNIXに標準でインストールされているコマンドのみを使って作られた、シェルスクリプト(csh)による簡単なレイトレーシングプログラム。
#!/bin/csh -f
set xres = 100
set yres = 100
set backcolor = ( 150 150 150 )
set pic = `basename $0 .sh`.ppm
cat << EOL > $pic
P3
$xres $yres
255
EOL
@ y = 0
while($y < $yres)
@ x = 1
while($x <= $xres)
echo $y $x
set eyevec = (`mkeye.sh $x $y $xres $yres`)
set t = (`interp.sh $eyevec`)
if($t[1] == "y") then
set color = (`shade.sh $t[2] $eyevec`)
else
set color = ( $backcolor )
endif
outdata.sh $color $pic
@ x ++
end
echo >> $pic
@ y ++
end
#!/bin/csh -f
if($#argv != 3) then
echo2 "Usage : `basename $0` x y z"
exit 1
endif
set x = $argv[1]
set y = $argv[2]
set z = $argv[3]
set r = 1
set vec = ( 0 0 -2 ) # point of sphere
set b = `(echo "$x * $vec[1] + $y * $vec[2] + $z * $vec[3]"; echo quit) | bc -l`
set d = `(echo "c = $vec[1] * $vec[1] + $vec[2] * $vec[2] + $vec[3] * $vec[3] - $r * $r" ; echo "d = $b * $b - c"; echo "if(d < 0) -1" ; echo "if(d >= 0) d"; echo quit) | bc -l`
if("$d" == "-1") then
echo "n 0"
exit
endif
set t = (`(echo "d = sqrt($d)" ; echo "-1 * $b - d" ; echo "-1 * $b + d" ) | bc -l`)
set tt = `(echo "if($t[2] < 0) -1"; echo "if($t[2] >= 0) $t[2]") | bc -l`
if("$tt" == "-1") then
echo "n 0"
exit
endif
echo y `(echo "if($t[1] < 0) $t[2]" ; echo "if($t[1] > $t[2]) $t[2]" ; echo "if($t[1] <= $t[2]) $t[1]") | bc -l`
#!/bin/csh -f
# $Header: /home/abe/school/manual/ray-project/RCS/shell.html,v 1.2 2010/06/05 16:29:47 abe Exp abe $
if($#argv != 4) then
echo2 "Usgae : `basename $0 x y xres yres"
exit 1
endif
set x = $argv[1]
set y = $argv[2]
set xres = $argv[3]
set yres = $argv[4]
(echo "r = $yres / $xres" ;\
echo "v = (2 * $x - $xres)/$xres" ;\
echo "w = r * (2 * $y - $yres)/$yres" ;\
echo "t = 1/sqrt(v*v + w*w + 1)" ;\
echo "v * t" ;\
echo "w * t" ;\
echo t ;\
echo quit ) | bc -l
#!/bin/csh -f
if($#argv != 4) then
echo2 "Usage : `basename $0 red green blue picname"
echo2 " red,green,blue : 0 ~ 255"
exit 1
endif
set color = ($argv[1] $argv[2] $argv[3])
set pic = $argv[4]
set safs = ( r g b )
set i = 1
while($i <= 3)
if($color[$i] > 255) then
set out = 255
else if($color[$i] < 0) then
set out = 0
else
set out = $color[$i]
endif
echo -n $out" " >> $pic
@ i ++
end
#!/bin/csh -f
if($#argv != 4) then
echo2 "Usage : `basename $0` t xvec yvec zvec"
exit 1
endif
set t = $argv[1]
set xvec = $argv[2]
set yvec = $argv[3]
set zvec = $argv[4]
set col = (`(echo "x = $t * $xvec" ; echo "y = $t * $yvec" ; echo "z = $t * $zvec + 1" ; echo "(-0.57735 * x + 0.57735 * y + 0.57735 * (z - 2) + 0.6) * 255" ; echo "0" ; echo "0" ; echo quit) | bc -l` )
foreach c ($col)
echo $c | awk -F"." '{print $1}'
end