В настоящее время я реализую простой трассировщик лучей в C ++. У меня есть класс с именем OrthonormalBasis, который генерирует три ортогональных единичных вектора из одного или двух указанных векторов, например:
void
OrthonormalBasis::init_from_u ( const Vector& u )
{
Vector n(1,0,0);
Vector m(0,1,0);
u_ = unify(u);
v_ = cross(u_,n);
if ( v_.length() < ONB_EPSILON )
v_ = cross(u_,m);
w_ = cross(u_,v_);
}
Я тестирую все свои методы с помощью инфраструктуры Unittest ++. Проблема в том, что существует более одного возможного решения для правильной ортонормированной основы. Например этот тест:
TEST ( orthonormalbasis__should_init_from_u )
{
Vector u(1,0,0);
OrthonormalBasis onb;
onb.init_from_u(u);
CHECK_EQUAL( Vector( 1, 0, 0 ), onb.u() );
CHECK_EQUAL( Vector( 0, 0, 1 ), onb.v() );
CHECK_EQUAL( Vector( 0, 1, 0 ), onb.w() );
}
иногда это удается, иногда это не удается, потому что векторы v и w также могут иметь отрицательный 1 и по-прежнему представлять действительный ортонормированный базис. Есть ли способ указать несколько ожидаемых значений? Или вы знаете другой способ сделать это?
Важно, чтобы я получил фактические и ожидаемые значения, напечатанные на стандартный вывод, чтобы отладить методы, чтобы это решение не выполняло работу:
TEST ( orthonormalbasis__should_init_from_u )
{
Vector u(1,0,0);
OrthonormalBasis onb;
onb.init_from_u(u);
CHECK_EQUAL( Vector( 1, 0, 0 ), onb.u() );
CHECK(
Vector( 0, 0, 1 ) == onb.v() ||
Vector( 0, 0,-1 ) == onb.v() );
CHECK(
Vector( 0, 1, 0 ) == onb.w() ||
Vector( 0,-1, 0 ) == onb.w() );
}