我目前实现在C的简单的射线追踪++。我有一个名为标准正交基类,它从一个或两个指定矢量生成三个正交单位矢量,例如:

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_);
}

我测试我所有的与单元测试++框架的方法。问题是,不存在用于一个有效的标准正交基多于一个可能的解决方案。例如,这测试:

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() );
}
有帮助吗?

解决方案

当然,如果你正在测试是你的基础是正交的,那么这就是你需要测试?

// check orthogonality

CHECK_EQUAL( 0, dot(onb.u(), onb.v));
CHECK_EQUAL( 0, dot(onb.u(), onb.w));
CHECK_EQUAL( 0, dot(onb.v(), onb.w));

// check normality

CHECK_EQUAL( 1, dot(onb.u(), onb.u));
CHECK_EQUAL( 1, dot(onb.v(), onb.v));
CHECK_EQUAL( 1, dot(onb.w(), onb.w));

其他提示

一种可能性是创建自己的CHECK_MULTI功能:

void CHECK_MULTI(TYPE actual, vector<TYPE> expected, const char* message)
{
  for (element in expected) {
    if (element == actual) {
      // there's a test here so the test count is correct
      CHECK(actual, element);
      return;   
    }
  }
  CHECK(actual, expected);
}

我会使用一个效用函数或类,所以你可以做这样的事情:

CHECK_EQUAL(VectorList(0,0,1)(0,0,-1), onb.v());

考虑,平等的这种解释是有点怪异,但它应该打印你要看到,而不需要引入自定义宏的所有值。结果 如果您在这方面担心EQUAL,像CHECK_CONTAINS()一个自定义宏应该不会太难的事。

VectorList将被构造为暂时和operator()被用于将值插入Vectors的包含列表,类似于 Boost.Assign

基本的方法:

class VectorList {
    std::vector<Vector> data_;
public:
    VectorList(double a, double b, double c) {
        data_.push_back(Vector(a,b,c));
    }
    VectorList& operator()(double a, double b, double c) {
        data_.push_back(Vector(a,b,c));
        return *this;
    }
    bool operator==(const Vector& rhs) const {
        return std::find(data_.begin(), data_.end(), rhs) != data_.end();
    }
};
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top