Это то, что я делаю в данный момент, но мне просто интересно, может быть, есть лучший способ?
Мой класс Kinematic Variable содержит только длинное двойное значение и логическое значение, если переменная установлена или нет. Я перегружен оператором присваивания.
// 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;
}
То, что я считаю, это то, что с 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
используются, поэтому нет необходимости проверять. Я думаю, что это справедливое решение, основанное на предполагаемых знаниях пользователя.
Других решений пока нет …