}
Vector3D makeFarPoint(const Vector3D& minPoint,
const Vector3D& maxPoint) const
{
return Vector3D (
nearPointMask & 1 ? minPoint.x : maxPoint.x, nearPointMask & 2 ? minPoint.у : maxPoint.у, nearPointMask & 4 ? minPoint.z : maxPoint.z );
}
int getMainAxis () const {
return mainAxis;
}
void apply ( const Transform3D& ); protected:
void computeNearPointMaskAndMainAxis () ;
};
Ниже приводится описание основных методов этого класса.
Метод flip переворачивает вектор нормали, при этом плоскость остается на месте, а положительное и отрицательное полупространства меняются местами.
Метод closestPoint возвращает точку на плоскости, ближайшую к данной.
Метод intersectByRay служит для определения точки пересечения плоскости с заданным лучом, возвращает признак наличия пересечения и значения параметра луча для точки пересечения.
Метод apply позволяет применять произвольное аффинное преобразование к плоскости.
Методы signedDistanceTo и distanceTo возвращают расстояние со знаком и без него от точки до плоскости.
Метод classify служит для определения положения точки относительно плоскости и возвращает, в каком полупространстве (или же в самой плоскости) лежит заданная точка.
Методы reflectPos и reflectDir служат для отражения точки и направления относительно данной плоскости.
Обратите внимание, что отражение вектора относительно плоскости происходит по-разному в зависимости от того, является ли данный вектор координатами точки (ЗЛО, а) или направлением в пространстве (3.10, б).
Рис. 3.10
Конструктор класса Plane позволяет строить экземпляр класса по вектору нормали и расстоянию, по коэффициентам уравнения, нормали и точке на плоскости и трем точкам.
Для задания ограничивающего тела в виде прямоугольного параллелепипеда с ребрами, параллельными осям координат (ААВВ), мы будем использовать следующий класс: Л.
class BoundingBox {
Vector3D minPoint; Vector3D maxPoint; public:
BoundingBox ( const Vector3D& vl, const Vector3D& v2 ) {