2009-06-16 6 views
5

iPhone의 방향을 45도 단위로 감지하고 싶습니다. 이상적으로 모든 축을 따라 방향 각도를 얻을 수 있기를 바랍니다.iPhone 화면 방향 감지

내가해야 할 일은 방향 변경시 iPhone의 Trism이 화면의 현재 하단 위치로 화살표를 깜박이는 것과 유사합니다.

내가 코딩 한 것이 있지만 실제로 가속도계 수치가 작동하는 방식을 이해하지 못하고 올바른 방향으로 찌르는 동작을 사용할 수 있습니다. 현재 코드는 현재 각도를 기록하지만 휴대 전화가 평평한 경우에도 초당 수 차례 격렬하게 변화하는 판독 값을 얻습니다. 로그에서

- (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 

답변

4

나는 당신이 float을 할 때 당신이 int 변수를 사용하고 있는지 문제가 생각합니다.

은 내가 accelerationX 생각하고 -Y 따라서 인스턴스 변수와 같아야합니다

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

더 당신이 찾고 있던 무엇을 제공해야합니다.

+0

답장을 보내 주셔서 감사합니다. int 대신 float를 사용하도록 코드를 변경했지만 기기가 평평하지 않은 경우 값이 급격하게 변동하는 결과를 얻고 있습니다. – Simon

+0

로그의 일부 줄을 질문에 추가했습니다. – Simon

+0

아, 인스턴스 변수에 관한 처음 코멘트를 놓쳤습니다. 해결책 일 수 있습니다. 다시 알려 드리겠습니다. – Simon

3

로컬 변수를 사용하지 않는 이유는 로컬 변수를 사용하기 때문입니다.

는 다음을 수행하십시오 :

는 인스턴스 변수를 선언 : 가속도계 위임에

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

... 

other declarations 

업데이트 변수 :

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

을 그것은 갑자기 점프없이보다 정확한 결과를 제공한다.