то, что у меня здесь, работает именно так, как я этого хочу.Мой вопрос в том, что это кажется слишком сложным, есть ли более быстрый / лучший способ выполнения вычислений pitchAngleRadians, которые я показываю ниже?
код показан ... (вместе с двумя изображениями)
первое изображение - это то, как вычисление atan2 естественно поступает из iPad, "pitchAngleRadians = atan2 (accel [0], accel 2 );"(что акселерометр выдает нормально)
что я хочу, это сместить «ноль» на новый угол в градусах, на втором изображении я сместил его на -135 градусов в качестве примера.(все в коде - это радианы), поэтому, например, переменная "pitchNeutralAngle" в этом примере представляет собой радиан, эквивалентный (-135) градусам
, этот код производит именно то, что я хочу для переменной "pitchAngleRadians", котораявторое изображение, но кажется слишком длинным, и этот код находится в тесном цикле, поэтому он ускорился бы, если бы я мог получить этот чище / быстрее.
я прошёл бы промежуточный этап «ранжирования»градусов от 0 до 360, так что пересечение границы 180 градусов не портит вычисление, однако мне все равно нужно вернуть его к форме от 0 до 180, так что это следующий расчет.
Я немного протестировал этот код, и он, кажется, работает.
//------------------------------------------------------------------------------------
- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
accel[0] = (acceleration.x * kFilteringFactor) + accel[0] * (1.0 - kFilteringFactor);
accel[1] = (acceleration.y * kFilteringFactor) + accel[1] * (1.0 - kFilteringFactor);
accel[2] = (acceleration.z * kFilteringFactor) + accel[2] * (1.0 - kFilteringFactor);
pitchAngleRadians = (atan2(accel[0], accel[2]) - pitchNeutralAngle);
pitchAngleRadians = pitchAngleRadians - floorf(pitchAngleRadians/6.28318f)*6.28318f;
if (pitchAngleRadians > 3.14159) pitchAngleRadians = -6.28318f + pitchAngleRadians;
//float a = atan2(accel[0], accel[2]);
//NSLog(@"a = %f", a);
}