if loc == sloe || loc == onPlane:
# portal lies on the same side or in plane
return []
if loc == inBack ScSc sloe == inFront: continue
if loc == inFront ScSc sloe == inBack: continue
if 16c == spanning: # plane splits portal in two parts portal.split ( plane, front, back ) if sloe == inFront:
portal = back elif sloe == inBack: portal = front return portal
Процедуры addClipPlanes, которые мы приводить не будем, служат для построения набора плоскостей по паре порталов. При этом плоскости проводятся через вершины первого портала и ребра второго портала. В список добавляются только те плоскости, для которых оба портала лежат но разные стороны.
ПРОСТЕЙШИЕ ГЕОМЕТРИЧЕСКИЕ АЛГОРИТМЫ И СТРУКТУРЫ
Быстрая оценка длины вектора Иногда возникает задача определения длины вектора, причем довольно часто скорость выполнения операции гораздо важнее точности. Обычно для вычисления длины вектора в трехмерном пространстве необходимы три операции умножения, две операции сложения и одна операция извлечения квадратного корня, что делает вычисление длины довольно дорогостоящим. Ниже приводится довольно простой метод, позволяющий быстро оценить длину вектора ценой довольно небольших затрат.
С каждым вектором v = (x, у, zf можно связать координатную ось, проекция вектора на которую имеет наибольшую длину (рис. 3.1). В качестве такой оси выбирается ось, соответствующая наибольшему по модулю значению компоненты вектора:
('„ = argmaxlvj,
где в качестве v, выступают координаты х, у и г
Простейшие геометрические алгоритмы и структуры
Тогда в качестве оценки длины вектора может выступать |v, |. Для вычисления этой величины можно использовать следующий фрагмент кода: га
float distariceToAlongAxis ( const Vector3D& p,
int axis ) const
{
return (float)fabs ( operator [] ( axis ) - p [axis] );
}
Для вычисления главной оси вектора мы будем использовать следующий метод:
intgetMainAxis () const {
int axis = 0 ;
float val = (float) fabs ( x );
for ( register int i = 1; i < 3 ; i + + ) {