# $Header: /home/abe/school/manual/ray-project/RCS/ruby.html,v 1.2 2010/06/05 16:29:47 abe Exp abe $
class Vector
def initialize(x, y, z)
@x = x
@y = y
@z = z
self
end
def + (v)
Vector.new(@x + v.x, @y + v.y, @z + v.z)
end
def - (v)
Vector.new(@x - v.x, @y - v.y, @z - v.z)
end
def * (t)
Vector.new(t * @x, t * @y, t * @z)
end
def normalize
d = Math.sqrt(@x * @x + @y * @y + @z * @z)
@x /= d
@y /= d
@z /= d
end
def innerproduct(v)
@x * v.x + @y * v.y + @z * v.z
end
attr_accessor :x, :y, :z
end
def make_eye(x, y)
Vector.new(-2.0 + x/50.0, 2.0 - y/50.0, 3.0)
end
def intersect(from, to, point, rad)
v = from - point
b = to.innerproduct(v)
c = v.innerproduct(v) - rad*rad
d = b*b - c
return -1 if d < 0
det = Math.sqrt(d)
t = -b + det
end
def shading(t, from, to, point)
l = Vector.new(0.5773, 0.5773, -0.5773)
v = from + to * t - point
v.normalize
d = l.innerproduct(v)
col = (255.0 * d).to_i + 50
col = 255 if col > 255
col = 0 if col < 0
print col," 0 0 "
end
print "P3\n200 200\n255\n"
rad = 1.0
to = Vector.new(0, 0, -1)
point = Vector.new(0, 0, 0)
(0...200).each do |y|
(0...200).each do |x|
from = make_eye(x, y)
t = intersect(from, to, point, rad)
if t >= 0
shading(t, from, to, point)
else
print "100 100 100 "
end
end
print "\n"
end