Pergunta

Eu estou querendo para detectar a orientação do iPhone em incrementos de 45 graus.Idealmente, eu gostaria de ser capaz de obter o ângulo de orientação ao longo de qualquer eixo.

A detecção de que eu preciso é semelhante à forma como Trism para o iPhone pisca uma seta para a atual posição inferior da tela quando a orientação muda.

Eu tenho algo codificado, mas realmente não entendo como o acelerômetro leituras de trabalho e poderia usar um empurrão na direção certa.Meu atual código registra o ângulo actual, mas mesmo quando o telefone está televisão eu fico leituras diferentes descontroladamente algumas vezes por segundo.

- (void) checkOrientation:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
    int accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
    int accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);

    float currentRawReading = (atan2(accelerationY, accelerationX)) * 180/M_PI;
    NSLog(@"Angle: %f",currentRawReading);
}

Exemplo de log quando o telefone é plano:

2009-06-16 17:29:07.987 [373:207] Angle: 0.162292
2009-06-16 17:29:07.994 [373:207] Angle: 179.838547
2009-06-16 17:29:08.014 [373:207] Angle: 179.836182
2009-06-16 17:29:08.032 [373:207] Angle: -90.000000
2009-06-16 17:29:08.046 [373:207] Angle: 179.890900
2009-06-16 17:29:08.059 [373:207] Angle: -90.000000
2009-06-16 17:29:08.074 [373:207] Angle: 179.917908
2009-06-16 17:29:08.088 [373:207] Angle: -179.950424
2009-06-16 17:29:08.106 [373:207] Angle: 90.000000
2009-06-16 17:29:08.119 [373:207] Angle: 90.000000
2009-06-16 17:29:08.134 [373:207] Angle: -179.720245
Foi útil?

Solução

Eu acho que o seu problema é que você está usando int variáveis quando quiser float.

Eu acho que o accelerationX e –Y devem ser variáveis de instância e, portanto:

accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);

Deve dar-lhe mais o que você estava procurando.

Outras dicas

A razão é que você está usando variáveis locais, enquanto eles não deveriam ser locais.

Tente fazer o seguinte:

Declarar variáveis de instância:

@interface YourViewControllerClass: UIViewController {
    float accelerationX, accelerationY;
}

...

other declarations

Atualização de variáveis no acelerômetro delegado:

 accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
 accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);

Ele deve dar resultados mais precisos, sem saltos repentinos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top