現在、C++ で単純なレイ トレーサーを実装しています。OrthonormalBasis という名前のクラスがあります。これは、1 つまたは 2 つの指定されたベクトルから 3 つの直交単位ベクトルを生成します。次に例を示します。
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() );
}