2010-08-13 2 views
1

Я пытаюсь создать физические тела, созданные в случайном положении со случайной скоростью, попавшей в цель. Я подбирала и слегка модифицировала этот код из Интернета, который использовал бурундук для запуска в Box2dBox2d Расчетная траектория

+ (CGPoint) calculateShotForTarget:(CGPoint)target from:(CGPoint) launchPos with:(float) velocity 
{ 
    float xp = target.x - launchPos.x; 
    float y = target.y - launchPos.y; 
    float g = 20; 
    float v = velocity; 
    float angle1, angle2; 

    float tmp = pow(v, 4) - g * (g * pow(xp, 2) + 2 * y * pow(v, 2)); 

    if(tmp < 0){ 
     NSLog(@"No Firing Solution"); 
    }else{ 
     angle1 = atan2(pow(v, 2) + sqrt(tmp), g * xp); 
     angle2 = atan2(pow(v, 2) - sqrt(tmp), g * xp); 
    } 

    CGPoint direction = CGPointMake(cosf(angle1),sinf(angle1)); 
    CGPoint force = CGPointMake(direction.x * v, direction.y * v); 

    NSLog(@"force = %@", NSStringFromCGPoint(force)); 
    NSLog(@"direction = %@", NSStringFromCGPoint(direction)); 

    return force; 
} 

Проблема заключается в том, я не знаю, как применить это к моей программе, у меня есть тяжесть -20 для у но положив 20 для g и более низкую скорость, такую ​​как 10 для v, получает меня только «No Firing Solution».

Что я делаю неправильно?

ответ

1

Более низкая скорость 10 никогда не будет работать, чтобы снаряд не имел достаточной мощности для перемещения расстояния.

Ошибка в расчете состоит в том, что все в метрах, за исключением расчетов расстояния, которые находятся в пикселях!

Изменение кода для этого установил сумасшедшие скорости я получаю:

+ (CGPoint) calculateShotForTarget:(CGPoint)target from:(CGPoint) launchPos with:(float) velocity 
{ 
    float xp = (target.x - launchPos.x)/PTM_RATIO; 
    float y = (target.y - launchPos.y)/PTM_RATIO; 
    float g = 20; 
    float v = velocity; 
    float angle1, angle2; 

    float tmp = pow(v, 4) - g * (g * pow(xp, 2) + 2 * y * pow(v, 2)); 

    if(tmp < 0){ 
     NSLog(@"No Firing Solution"); 
    }else{ 
     angle1 = atan2(pow(v, 2) + sqrt(tmp), g * xp); 
     angle2 = atan2(pow(v, 2) - sqrt(tmp), g * xp); 
    } 

    CGPoint direction = CGPointMake(cosf(angle1),sinf(angle1)); 
    CGPoint force = CGPointMake(direction.x * v, direction.y * v); 

    NSLog(@"force = %@", NSStringFromCGPoint(force)); 
    NSLog(@"direction = %@", NSStringFromCGPoint(direction)); 

    return force; 
} 
+0

Не могли бы вы объяснить, как вы бы использовать это, пожалуйста? –

Смежные вопросы