Как правильно конвертировать QGyroscopeReading в QVector3D?

Есть ли правильный / хороший способ конвертировать 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()));

Конечно, есть что-то лучше?

0

Решение

Из Qt док. Класс QGyroscopeReading:

Единицы QGyroscopeReading

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

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

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

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

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

1

Другие решения

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

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

По вопросам рекламы [email protected]