2013-12-23 2 views
0

가속도계로 UIImageView를 움직이려고했지만 문제가 발생했습니다. 데이터를 부드럽게하고 원래 위치에서 데이터의 가속화를 시도하면 값이 무한대로 반환됩니다. 나는 내가 무엇을 잘못하고 있는지 정말로 모른다! 나는 NSLog accY, 그것은 적절한 값을 반환 할 때Accelerometer 계산으로 인해 inf가 발생했습니다.

- (void)viewDidLoad { 
    gameObjects = [NSMutableArray arrayWithObjects: nil]; 

    UIImageView* mainChar = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; 
    [mainChar setCenter:CGPointMake(screenHeight/2, screenWidth/2)]; 
    mainChar.image = [UIImage imageNamed:@"dot.png"]; 
    [self.view insertSubview:mainChar atIndex:2]; 
    [gameObjects addObject:mainChar]; 
    mainChar = nil; 

    AvData = [NSMutableArray arrayWithObjects: nil]; 

    motionManager = [[CMMotionManager alloc] init]; 
    motionManager.deviceMotionUpdateInterval = 20; 

    [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData* accelerationData, NSError* error) { 
    if (defaultData == nil) {defaultData = accelerationData;} 
    [self accelerometerUpdate:accelerationData]; 
}]; 
} 

-(void) accelerometerUpdate:(CMAccelerometerData*)aData { 

    //Accelerometer Smoothing 
    [AvData addObject:aData]; 
    if ([AvData count] >= 20) {[AvData removeObjectAtIndex:0];} 
    float avX = 0; 
    float avY = 0; 
    float avZ = 0; 
    for (int i = 0; i < [AvData count]; i++) { 
     avX = avX + [[AvData objectAtIndex:i] acceleration].x; 
     avY = avY + [[AvData objectAtIndex:i] acceleration].y; 
     avZ = avZ + [[AvData objectAtIndex:i] acceleration].z; 
    } 

    avX = avX/([AvData count] - 1); 
    avY = avY/([AvData count] - 1); 
    avZ = avZ/([AvData count] - 1); 

    //Calculate the delta from original device acceleration value 
    float accX = defaultData.acceleration.x - avX; 
    float accY = defaultData.acceleration.y - avY; 
    //float accZ = defaultData.acceleration.z - avZ; 

    NSLog([NSString stringWithFormat:@"%f", accY]); 

    UIImageView* mainChar = [gameObjects objectAtIndex:0]; 

    [mainChar setCenter:CGPointMake(mainChar.center.x + accX, mainChar.center.y + accY)]; 
    //accX and accY are infinity for some reason, and so the image disappears! 

    mainChar = nil; 
} 

이상한 것은이 :

여기 내 코드입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 내 머리 위로 떨어져

답변

0

:

당신이이 라인에 도착하면 :

AVX = AVX/([AvData 수] - 1); avY = avY/([AvData 수] - 1); avZ = avZ/([AvData 수] - 1);

그 시점에서 count == 1이면 코드가 0으로 나뉩니다. 나는 그것이 충돌하기를 기대하지만 그렇지 않다면 결과는 무한대 나 NAN이 될 것입니다. (NAN이 필요 하겠지만, 예외를 throw하지 않으면 INF를 반환 할 수 있습니다. 테스트하거나 확인해야합니다.)

+0

아, 감사합니다! 이제 잘 작동합니다. 끝에는 아무것도 포함되지 않았다는 것을 내 머리 속에 알았 더라면! – Hamish

+0

addObject :를 호출 할 때 nil은 가변 개수의 인수를 사용하는 메소드에서 사용되는 매개 변수 끝 표식 일뿐입니다. 이것은 C 언어의 varargs 메커니즘에서 보류입니다. 새로운 객체 리터럴 구문을 선호합니다. NSArray * anArray = @ [@ (1), @ (2), @ (3)]; –

관련 문제