Pregunta

Estoy tratando de cuerpos física maquillaje generados en una posición aleatoria con una velocidad aleatoria alcanzar un objetivo. Espigué y ligeramente modificado el código de la web que estaba utilizando ardilla para correr en Box2D

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

El problema es que no sé cómo se aplica esto a mi programa, tengo una gravedad de -20 para y 20 para poner pero gy una velocidad más baja como 10 para v consigue nada más que "No se Firing Solution" .

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

Una menor velocidad de 10 nunca se va a trabajar el proyectil no tiene suficiente energía para recorrer la distancia.

El error en el cálculo es que todo está en metros a excepción de los cálculos de distancia, que son en píxeles!

Cambiar el código para que esto esté arreglado las velocidades locas que estaba haciendo:

+ (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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top