2009-06-16 33 views
5

iPhone'un yönünü 45 derecelik artışlarla tespit etmek istiyorum. İdeal olarak, herhangi bir eksen boyunca yönelim açısı elde etmek istiyorum.iPhone ekran yönünü tespit edin

Yapmam gereken algılama, yönlendirme değiştiğinde iPhone için Trism'in, ekranın geçerli alt konumuna doğru bir ok işareti nasıl yanıp söndüğüne benziyor.

Kodlanmış bir şey var ama gerçekten ivmeölçer okumalarının nasıl çalıştığını anlamıyor ve doğru yönde bir dürtüyü kullanabiliyor. Geçerli kod şu andaki açıyı kaydeder, ancak telefon düz olduğunda bile, birkaç kez birkaç kez değişen okumalar elde ederim. günlüğünden

- (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); 
} 

Numune telefon düz iken:

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 

cevap

4

Sana float istediğinizde int değişkenleri kullanıyorsanız bu senin problemin olduğunu düşünüyorum.

ben accelerationX düşünmek ve -Y böylece örnek değişkenleri ve olmalıdır:

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

daha Aradığın ne vermeli.

+0

Cevabınız için teşekkür ederim, kodları şamandıralar arasında kullanmak için değiştirdim, ancak aygıt düz uzanırken hesaplanan çılgınca dalgalanan değerlerin sonucunu almaya devam ediyorum. – Simon

+0

Günlüğe sorgudan bazı satırlar eklendi. – Simon

+0

Ah, örnek değişkenlerle ilgili ilk kez yorumunuzu kaçırdı, çözüm gibi görünüyor, size geri dönecek. – Simon

3

Yerel neden olmasalar da yerel değişkenleri kullanmanızdır.

aşağıdakileri yapmak için deneyin:

örnek değişkenleri bildir: akselerometre temsilci

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

... 

other declarations 

Güncelleme değişkenleri:

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

Ani sıçramalar olmadan daha hassas sonuçlar vermelidir.

İlgili konular