سؤال

أريد اكتشاف اتجاه iPhone بزيادات 45 درجة. من الناحية المثالية، أود أن أكون قادرا على الحصول على زاوية الاتجاه على طول أي محور.

الكشف الذي أحتاج إلى القيام به هو مشابه لكيفية تومض Trism من أجل iPhone سهم باتجاه الموضع السفلي الحالي للشاشة عند تغيير الاتجاه.

لدي شيء مشفرة، لكنني لا أفهم حقا كيف تعمل قراءات التسارع واستخدامها في الاتجاه الصحيح. يسجل الرمز الحالي الزاوية الحالية ولكن حتى عندما يكون الهاتف مسطحا أحصل على قراءات متفاوتة بعنف عدة مرات في الثانية.

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

عينة من سجل بينما الهاتف مسطح:

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
هل كانت مفيدة؟

المحلول

أعتقد أن مشكلتك هي أنك تستخدم int المتغيرات عندما تريد float.

اعتقد ان accelerationX و -Y يجب أن تكون متغيرات مثيل وبالتالي:

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

يجب أن تعطيك أكثر ما كنت تبحث عنه.

نصائح أخرى

السبب هو أنك تستخدم المتغيرات المحلية، في حين أنهم لا ينبغي أن يكون محليين.

حاول القيام بما يلي:

إعلان المتغيرات المثلية:

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

...

other declarations

تحديث المتغيرات في مفوض التسارع:

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

يجب أن تعطي نتائج أكثر دقة دون قفزات مفاجئة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top