0

这就是我目前正在做的事情,但我只是想知道是否有更好的方法?

如果变量已设置,我的运动学变量类只包含一个长双精度值和一个布尔值。我重载了 = 赋值运算符。

// v_f = v_o + a*t
bool KinematicEquations::equation_vat(KinematicVariable &vo, KinematicVariable &vf,
                                      KinematicVariable &a, KinematicVariable &t)
{
    if (vf.isUsed() && vo.isUsed() && a.isUsed())
        t = (vf.value() - vo.value()) / a.value();  // t = (vf - vo)/a
    else if (vf.isUsed() && vo.isUsed() && t.isUsed())
        a = (vf.value() - vo.value()) / a.value();  // a = (vf - vo)/t
    else if (vf.isUsed() && t.isUsed() && a.isUsed())
        vo = vf.value() - a.value() * t.value(); // vo = vf - a*t
    else if (vo.isUsed() && t.isUsed() && a.isUsed())
        vf = vo.value() + a.value() * t.value(); // vf = vo + at
    else
        return false;

    return true;
}
4

1 回答 1

2

我会考虑的是,witht = 0和/或a = 0这个等式或多或少是无用的。结果是vo = vf. 所以,我会说先检查它们。具有物理知识的用户可能会认为如果 t 或 a 为零,您必须为它们求解:

bool KinematicEquations::equation_vat(KinematicVariable &vo, KinematicVariable &vf,
                                      KinematicVariable &a, KinematicVariable &t)
{
    if (t == 0)
        t = (vf.value() - vo.value()) / a.value();  // t = (vf - vo)/a
    else if (a == 0)
        a = (vf.value() - vo.value()) / a.value();  // a = (vf - vo)/t
    else if (vf.isUsed())
        vo = vf.value() - a.value() * t.value(); // vo = vf - a*t
    else if (vo.isUsed())
        vf = vo.value() + a.value() * t.value(); // vf = vo + at
    else
        return false;

    return true;
}

这样做至少可以为您节省一些操作。将变量初始化为0如果它们没有被使用,它们将有0s 并且一切都很好。此外,当您到达最后两个时,您已经确定a并且t已使用,因此无需检查。我认为这是一个基于用户感知知识的公平解决方案。

于 2013-03-03T07:28:57.573 回答