Листинг 14.8. Скелет метода hitO для класса TaperedCylinder
bool TaperedCylinder::hit (Ray Sr. Intersection Sinter) {
Ray genRay: // generic ray // базовый луч
xfrmRay(genRay.invTransf,r):
double А. В. C. discrim. disc_root. tl.t2.tb.tc:
double sm - small Radius - 1:
double fDir - sm * genRay.dir.z: // handy short names // удобные сокращенные имена
double fStart = sm * genRay.start.z + 1;
get A. B, and С as in Equation 14.16 // вычисляем А. В. С. как в уравнении 14.16
discrim - B*B - A*C:
int num - 0: // no hits yet // пока соударений нет
if(discrim > 0.0) // can take square root // можно извлечь квадратный корень {
disc_root = (double)sqrt(double(discrim));
tl ' (-B - disc_root)/A: // earlier hit // более раннее соударение
float zHit - genRay.start.z + genRay.dir.z * tl: 11 г component of ray // z-компонент луча
if(tl > 0.00001 && zHit <= 1.0 && zHit >= 0)
{
inter.hit[num].hitTime - tl:
inter.hit[num++].surface - 0: // hit is with wall // соударение со стенкой }
t2 - (-B + disc_root)/A: // second hit // второе соударение продолжение&
Введение в трассировку лучей
Листинг 14.8 (продолжение)
zHit - genRay.start.z + genRay.dir.z * t2: i
if(t2 > 0.00001 && zHit <- 1.0 && zHit >-0)
{
inter.hit[num].hitTime - t2:
inter.hit[num++],surface - 0: // hit is with wall // соударение со стенкой }
}
// end 1f(discrim > 0)
// конец блока if(discrim > 0)
// test the base at z - 0
// проверяем основание при z - 0
tb - -genRay.start.z/genRay.dir.z: // hit time at z - 0 plane // вреия соударения с плоскостью z - 0
if(tb > 0.00001 && SQRCgenRay.start, x + genRay.dir.x * tb) + SQR(genRay.start.у + genRay.dir.y * tb) < 1) // within disc of base // внутри диска основания
{
inter.hit[num].hitTime - tb:
inter.hit[num++].surface - 1: // 1 for the base // 1 для основания }
// test the cap at z - 1
// проверяем крышку при z - 1
tc - (1 - genRay.start.z)/genRay.dir.z: // hit time at z - 1 plane // время соударения с плоскостью z - 1
if(tc > 0.00001 && SQR(genRay.start.x + genRay.dir.x * tc)