我目前正在用 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() );
}