Есть ли правильный / хороший способ конвертировать QGyroscopeReading
в QVector3D
в Qt5?
QGyroscopeReading
имеет свой Икс,Y а также Z значения хранятся как qreal
, в то время как QVector3D
использования float
,
Поскольку qreal не гарантированно является плавающим (его тип указывается во время сборки Qt), наивное преобразование без предупреждений выглядит действительно ужасно:
QGyroscopeReading gr;
QVector3D myVec(static_cast<float>(gr.x())
, static_cast<float>(gr.y())
, static_cast<float>(gr.z()));
Конечно, есть что-то лучше?
Из Qt док. Класс QGyroscopeReading:
Единицы QGyroscopeReading
Показание содержит 3 значения, измеренные в градусах в секунду, которые определяют движение устройства вокруг осей x, y и z. В отличие от QRotationReading, значения представляют текущую угловую скорость, а не фиксированное вращение. Измерения в градусах в секунду.
Итак, преобразование qreal
в float
ваша наименьшая проблема, за исключением того, что вы просто хотите сохранить значения в QVector3D
(помня, что это не представляет точку или вектор в трехмерном пространстве). Но если это так, то ваше обращение в порядке. (Хотя я не понимаю, почему не хранить показания гироскопа так же, как QGyroscopeReading
.)
Если вы хотите подать заявку QGyroscodeReading
к QVector3D
(например, чтобы отобразить эффект), тогда вы можете применить повороты к предопределенному вектору (например, QVector3D(0, 0, 1)
). Для накопленного обновления также потребуется время (для преобразования угловых скоростей в углы).
На время QGyroscopeReading::timestamp()
может быть интересным (то есть определить длительность от текущей временной метки и предыдущей). Хотя, док. не очень обнадеживает
Обратите внимание, что некоторые платформы не доставляют метки времени правильно. Приложения должны быть готовы к случайным проблемам, которые приводят к тому, что временные метки переходят назад.
Это разработано, чтобы выглядеть уродливым. Это должно напомнить вам, что здесь есть некоторый опасный код.
Чтобы предотвратить распространение такого кода в проекте, унаследуйте свой класс от QVector3D и определите конструктор с помощью qreal
параметры.
class QRealVector3D: public QVector3D
{
QRealVector3D (qreal x, qreal y, qreal z):
QVector3D (static_cast<float>(x)
, static_cast<float>(y)
, static_cast<float>(z)
{}
}