这就是我现在所做的,但我只是想知道是否有更好的方法?
如果已设置变量,我的运动变量类只保留一个long double值和一个bool。我重载了=赋值运算符。
// 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;
}
答案 0 :(得分:2)
我会考虑使用t = 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
如果它们没有被使用,它们将具有0
并且一切都很好。此外,当您到达最后两个时,您已经确定已使用a
和t
,因此无需检查。我认为这是一个基于用户感知知识的公平解决方案。