2010-06-11 12 views
1

Je suis en train de programmer un jeu et je suis arrivé à un point très difficile. Fondamentalement, j'ai un cercle et j'ai 2 angles sur ce cercle. L'angle 1 (A) est un point vers lequel je veux que l'angle 2 (B) passe. Au cours de mon jeu chaque cadre que j'ai besoin de vérifier ou non pour augmenter ou diminuer ma valeur d'angle d'une certaine quantité (vitesse) pour finalement atteindre le premier angle. Ma question est comment je fais ça?Comment savoir quand augmenter ou diminuer l'angle pour obtenir un angle spécifique?

J'ai essayé de le faire mais je ne semble pas le faire correctement.

bool increase = false; 

float B = [self radiansToDegrees:tankAngle]; 
float A = [self radiansToDegrees:tankDestinationAngle]; 
float newAngle = B; 

if(B < A) { 

    float C = B - (360 - A); 
    float D = A - B; 

    if(C < D) increase = false; 
    else increase = true; 

} else if(B > A) { 

    float C = B - A; 
    float D = A - (360 - B); 

    if(C < D) increase = false; 
    else increase = true; 

} 

if(increase) { 
    newAngle += 1.0; 
} else { 
    newAngle -= 1.0; 
} 

if(newAngle > 360.0) { 
    newAngle = 0 + (newAngle - 360.0); 
} else if(newAngle < 0.0) { 
    newAngle = 360 + newAngle; 
} 

if(newAngle == 0) newAngle = 360; 

newAngle = [self degreesToRadians:newAngle]; 

[self setTanksProperPositionRotation:newAngle]; 

L'effet de base que je suis en train de réaliser est lorsque l'utilisateur fait un nouveau point, ce qui serait l'angle 1, l'angle 2 se déplacerait vers l'angle 1 choisir la direction la plus rapide. Je pense que j'ai passé environ 4 heures à essayer de comprendre cela.

Répondre

0

Fondamentalement, vous voulez vérifier quel angle vous donne la plus petite longueur arc (L).

alt text

alt text

+0

Merci beaucoup. J'ai juste compris ce que signifie le premier symbole de l'équation. – Thomas

+0

@ Thomas: Je suis content que je puisse aider. Voulez-vous dire le 'a'? C'est l'angle mesuré en degrés. Si vous avez l'angle en radians alors le type est plus simple: 'L = theta * r' –

+5

Cette réponse est inutile. Puisque r, pi et 180 sont toutes des constantes, vous dites en gros * "utilisez l'angle le plus petit" * - c'est ce qui le dérange! –

1

Normaliser les angles entre 0 et 360 degrés, et de prendre la valeur la plus petite:

float normalize(float angle) 
{ 
    while(angle < 0) 
     angle += 360; 
    return angle % 360; 
} 

//To use... 
float angle1 = A - B; 
float angle2 = B - A; 
if(normalize(angle1) < normalize(angle2)) 
    //Use angle1 
else 
    //Use angle2 
+0

"L'angle 1 (A) est un point vers lequel je veux que l'angle 2 (B) passe." –

+0

@Pete: Merci, j'ai raté ça; corrigée. –

1

En supposant que le courant et désiré sont positifs et inférieur à 360:

float inc; // abs. distance from current to desired if incrementing 
float dec; // abs. distance from current to desired if decrementing 

if (current > desired) 
{ 
    inc = current + 360.0f - desired; // incrementing would wrap over 
    dec = current - desired; 
} 
else 
{ 
    inc = desired - current; 
    dec = current + 360.0f - desired; // decrementing would wrap over 
} 

// the expressions above are arranged so inc and dec are both +ve 
// so just compare them 
if (inc < dec) 
    newAngle = current + step; 
else 
    newAngle = current - step;