2010-08-13 6 views
1

J'essaie de générer des corps physiques à une position aléatoire avec une vitesse aléatoire atteinte par une cible. Je glané et légèrement modifié ce code à partir du Web qui utilisait tamia pour fonctionner dans Box2dBox2d Calcul de la trajectoire

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

Le problème est que je ne sais pas comment appliquer à mon programme, j'ai un poids de -20 pour y mais mettre 20 pour g et une vitesse plus faible comme 10 pour v ne me donne rien mais "No Firing Solution".

Qu'est-ce que je fais mal?

Répondre

1

Une vitesse inférieure de 10 ne fonctionnera jamais, le projectile n'a pas assez de puissance pour parcourir la distance.

L'erreur dans le calcul est que tout est en mètres sauf pour les calculs de distance qui sont en pixels!

Modification du code à ce fixe les vitesses folles que je recevais:

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

Pouvez-vous expliquer comment vous utiliser cela, s'il vous plaît? –