Это правильный код для переноса угла (-180,180]

Я читаю это книга и я наткнулся на эту функцию wrapPi(), Я знаю, как обернуть угол, но что именно делает этот код

float wrapPi ( float theta ) {
// Check if already in range. This is not strictly necessary,
// but it will be a very common sit u a t i o n . We don ’ t want to
// incur a speed hit and perhaps floating precision loss if
// it’s not necessary
if ( fabs( theta ) <= PI ) {
// One revolution is 2PI .
const float TWOPPI = 2.0f∗PI ;
// Out of range. Determine how many ”revolutions”
// we need to add .
float revolutions = floor (( theta + PI ) ∗ ( 1.0f /TWOPPI )) ;
// Subtract it off
theta −= revolutions ∗ TWOPPI ;
}
return theta;
}

0

Решение

В этой строке есть ошибка:

if ( fabs( theta ) <= PI ) {

Так должно быть

if ( fabs( theta ) > PI ) {

Это единственное условие, при котором вы не можете просто вернуть существующее значение theta,
Остаток от if утверждение работает, сколько раз вам нужно добавить или
вычтите 2 * PI, чтобы найти угол, эквивалентный theta в правильном диапазоне.

Лично я предпочитаю писать отдельные блоки кода для if (theta <= -PI)
а также if (theta > PI), но это, возможно, предубеждение из-за столкновения
очень медленная реализация fabs в прошлом.

2

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

Он отображает угол тета с (тета <= -pi || theta> = pi) в диапазоне -pi … pi.

// if false theta is already >=-PI && <=PI
if ( fabs( theta ) <= PI ) {
// This is the range between -PI and PI
const float TWOPPI = 2.0f∗PI ;

// The next two steps are kind of an floating point modulo(theta,2PI)
float revolutions = floor (( theta + PI ) ∗ ( 1.0f /TWOPPI )) ;
theta −= revolutions ∗ TWOPPI ;
}

тета в рад

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector