Введение в программирование трехмерных игр с DX9

       

Равенство векторов


Равенство векторов

В геометрии два вектора считаются равными, если они указывают в одном и том же направлении и имеют одинаковую длину. В алгебре говорят, что векторы равны, если у них одинаковое количество измерений и их соответствующие компоненты равны. Например, (ux,uy, uz) = (vx, vy, vz) если ux = vx, uy = vy и uz = vz.

В коде мы можем проверить равны ли два вектора, используя перегруженный оператор равенства:

D3DXVECTOR u(1.0f, 0.0f, 1.0f); D3DXVECTOR v(0.0f, 1.0f, 0.0f); if( u == v ) return true;

Аналогичным образом, можно убедиться, что два вектора не равны, используя перегруженный оператор неравенства:

if( u != v ) return true;

ПРИМЕЧАНИЕ

Сравнивая числа с плавающей точкой следует быть очень аккуратным, поскольку из-за погрешностей округления, два числа с плавающей точкой, которые должны быть равными, могут слегка отличаться. По этой причине мы проверяем приблизительное равенство чисел с плавающей точкой. Для этого мы определили константу EPSILON, содержащую очень маленькое значение, которое будет служить «буфером». Мы будем говорить, что два числа приблизительно равны, если разница между ними меньше EPSILON. Другими словами, EPSILON дает нам некий допуск для ошибок округления чисел с плавающей точкой. Приведенная ниже функция показывает, как EPSILON может использоваться при проверке равенства двух чисел с плавающей точкой:

const float EPSILON = 0.001f; bool Equals(float lhs, float rhs) { // если lhs == rhs разность должна быть равна нулю return fabs(lhs - rhs) < EPSILON ? true : false; }

Об этом не надо беспокоиться, работая с классом D3DXVECTOR, поскольку перегруженные операции сравнения все сделают за нас, но очень важно знать об этой особенности сравнения чисел с плавающей точкой.

Содержание раздела