Je suis actuellement en train de mettre en œuvre un simple traceur de rayons en C++. J'ai une classe nommée Base de Hilbert, qui génère trois vecteurs unitaires orthogonaux d'un ou deux vecteurs spécifiés, par exemple:Unittest ++: test de plusieurs valeurs possibles
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_);
}
Je teste toutes mes méthodes avec unittest ++. Le problème est, qu'il y a plus d'une solution possible pour une base orthonormale valide. Par exemple ce test:
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());
}
parfois il réussit, parfois, il échoue, car les vecteurs v et w pourraient aussi avoir un 1 négatif, et représentent toujours une base orthonormée valide. Existe-t-il un moyen de spécifier plusieurs valeurs attendues? Ou connaissez-vous une autre façon de faire cela?
Il est important que je reçois les valeurs réelles et attendues imprimées au stdout, afin de déboguer les méthodes donc cette solution ne sera pas faire le travail:
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());
}
maintenant c'est tellement simple que je ne pouvais pas y penser. Merci! –