fordnt f - 0: f < numFaces: f++){ Vector3 diff:
Vector3 normal(norm[ face[ f].vert[ 0].normlndex] ); // use constructors // используем конструкторы
Point3 point(pt[ face[ f] .vert[ 0] .vertlndex] ):
form diff = point - genRay. start II формируем разность…
numer = dot3D(normal.diff):
denom - dot3D(normal.genRay.dir):
if(fabs(denom) < eps) … as before II как раньше
… same as before … . II так же. как и раньше Практические упражнения
14.6.5. Задание нормального вектора для пересечения куба Напишите функцию Vector3 cubeNormal (int which), которая возвращает внешнюю нормаль к грани which куба, в соответствии с листингом 14.1. Возможно, что наиболее читабельный код получится при использовании одного оператора переключателя на шесть положений, который присваивает вектору одно из шести аппаратно заданных значений. При слегка сокращенном подходе осуществляется распознавание структуры нормалей и их вычисление для помощи следующих команд:
1nt m - which/2.п - (whichS2)? -1:1: 1f(m - 0)v.set( 0. п. 0): else if(m - 1) v.set( п. 0. 0): else v.set( 0. 0. n): Разберитесь, как работает данный метод, и перепишите функцию cubeNormal так, чтобы она использовала этот метод.
14.6.6. Плоскости тетраэдра Используя для руководства табл. 6.7, покажите элементы списка плоскостей для правильного тетраэдра.
14.6.7. Усовершенствование метода hit() для выпуклого полиэдра Напишите с подробностями метод ConvexPolyhedron :: hit() для пересечения луча с выпуклым полиэдром. (За деталями класса ConvexPolyhedron обращайтесь к классу Shapes в приложении В.)
14.6.8. Ручное вычисление моментов «протыкания» базового куба Найдите для луча (4, 5, 6) + (-8, -8, -10) t шесть моментов протыкания, начертите их так, как на рис. 14.12, а, и определите интервал времени t, для которого луч находится внутри куба. Повторите все это для луча (4,5,6) + (-12, -8, -10) t. Пересекается ли с кубом этот луч?
}
а б
Рис. 14.13. Двумерные объекты и их плоскости граней: а) выпуклый; б) невыпуклый
14.6. Пересечение лучей с другими примитивами