Как правильно конвертировать QGyroscopeReading в QVector3D? - PullRequest
0 голосов
/ 27 августа 2018

Есть ли правильный / хороший способ конвертировать QGyroscopeReading в QVector3D в Qt5 ?

QGyroscopeReading имеет свои x , Значения y и z хранятся как qreal, в то время как QVector3D использует float.

Поскольку qreal не гарантируется как float (его тип указан в сборке Qtвремя), наивное преобразование без предупреждений выглядит действительно ужасно:

QGyroscopeReading gr;
QVector3D myVec(static_cast<float>(gr.x())
  , static_cast<float>(gr.y())
  , static_cast<float>(gr.z()));

Неужели есть что-то лучше?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Из Qt doc. QGyroscopeReading Class :

QGyroscopeReading Units

Показание содержит 3 значения, измеренные в градусах в секунду, которые определяют движение устройства вокруг x, y иОси Z.В отличие от QRotationReading , значения представляют текущую угловую скорость, а не фиксированное вращение.Измерения выполняются в градусах в секунду.

Итак, преобразование qreal в float является вашей наименьшей проблемой, за исключением того, что вы просто хотите сохранить значения в QVector3D (помните, что это нене представляет точку или вектор в трехмерном пространстве).Но если это так, то ваше обращение в порядке.(Хотя я не понимаю, почему не хранить показания гироскопа просто как QGyroscopeReading.)

Если вы хотите применить QGyroscodeReading к QVector3D (например, для отображения эффекта), тогда выможет применить повороты к предопределенному вектору (например, QVector3D(0, 0, 1)).Для кумулятивного обновления также потребуется время (для преобразования угловых скоростей в углы).

Для времени может быть интересным QGyroscopeReading::timestamp() (т.е. определить длительность по текущемуотметка времени и предыдущая).Хотя, док.не очень обнадеживает:

Обратите внимание, что некоторые платформы не доставляют метки времени правильно. Приложения должны быть готовы к случайным проблемам, которые приводят к скачкам времени назад.

0 голосов
/ 27 августа 2018

Он создан, чтобы выглядеть уродливо.Это должно напомнить вам, что здесь есть некоторый опасный код.

Чтобы предотвратить распространение такого кода в проекте, унаследуйте ваш класс от 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)
{}
}
...