2013-12-23 110 views
0

我一直试图去加速度计移动UIImageView,但我遇到了问题。当我尝试平滑数据并计算出原始位置的数据加速度时,这些值将返回无穷大。我不确定我做错了什么!加速度计计算导致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; 
} 

奇怪的是,当我的NSLog ACCY,它返回一个适当的值。我究竟做错了什么?

回答

0

关闭我的头顶:

当你到这些行:

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

如果在该点计数== 1,则您的代码将被零除。我期望会崩溃,但如果没有,结果将是无限或NAN。 (我期望NAN,但是如果它没有抛出异常,它可能会返回INF,我需要测试它,或者查看它以确定。)

+0

好的,谢谢!现在工作正常。在我的脑海里,计数包括最后的零! – Hamish

+0

调用addObject的nil只是一个参数结束标记,用于需要可变数量参数的方法中。这是C语言可变参数机制的延续。我更喜欢新的对象文字语法:NSArray * anArray = @ [@(1),@(2),@(3)]; –