Pregunta

Estoy queriendo detectar la orientación del iPhone en incrementos de 45 grados. Idealmente me gustaría ser capaz de obtener el ángulo de orientación a lo largo de cualquier eje.

La detección tengo que hacer es similar a cómo Trism para el iPhone parpadea una flecha hacia la posición inferior de la pantalla actual cuando los cambios de orientación.

Tengo algo codificado hasta, pero realmente no entiendo cómo el trabajo y las lecturas del acelerómetro podría utilizar un empujón en la dirección correcta. Mi código actual registra el ángulo actual pero incluso cuando el teléfono está plana recibo lecturas que varían tremendamente un par de veces 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);
}

Ejemplo de registro mientras el teléfono es 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
¿Fue útil?

Solución

Creo que su problema es que usted está utilizando variables int cuando se quiere float.

Creo que el accelerationX y -Y deben ser variables de instancia y, por tanto:

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

En caso de que dar más de lo que estaban buscando.

Otros consejos

La razón es que usted está utilizando variables locales, mientras que ellos no deben ser locales.

Trate de hacer lo siguiente:

Declarar variables de instancia:

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

...

other declarations

Actualizar las variables de delegado acelerómetro:

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

Se debe dar resultados más precisos y sin saltos bruscos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top