2010-02-07 7 views
0

J'utilise un glutTimerFunc (...) pour réaliser le mouvement du bras du robot, mon problème est le côté gauche 0 degré à 90 est facilement fait,180 à -180 mouvement dans opengl C++?

quand j'essaie 0 à -90 degrés, le bras n'est pas arrêter? J'ai essayé différentes méthodes, mais toutes falied, pouvez-vous suggérer de meilleures options?

ici est ma fonction de minuterie,

void myTimerFunc(int var) 
{ 
switch(var) 
{ 
case 1: if(shoulder>=90) 
      stop=1;

if(!stop) 
    {  
     shoulder = (shoulder + 5); 
     glutPostRedisplay(); 
     glutTimerFunc(100,myTimerFunc,1); 
     break; 
    } 


    if(shoulder<=0) 
     stop1=1; 

    if(!stop1) 
    { 
     shoulder = (shoulder - 5); 
     glutPostRedisplay(); 
     glutTimerFunc(100,myTimerFunc,1); 
     break; 
    } 

Cas n ° 2: si (épaule> = 360)

 stop2=1; 

    if(!stop2) 

    { 

     shoulder = (shoulder - 5); 

     glutPostRedisplay(); 

     glutTimerFunc(100,myTimerFunc,2); 

     break; 

    } 

// ici le bras de robot ne s'arrête pas ...........

if(shoulder<=270) 
     stop2 = 0; 
     stop3 = 1; 



    if(!stop3) 

    { 

     shoulder = (shoulder + 5); 

     glutPostRedisplay(); 

     glutTimerFunc(100,myTimerFunc,2); 

     break; 

    } 

par défaut: break; }}

J'appelle cette fonction de clavier .......

void keyboard (unsigned char key, int x, int y) 
{ 
    switch (key) 
    { 
     case 's':    
     glutTimerFunc(100,myTimerFunc,1); 
      break; 

     glutTimerFunc(100,myTimerFunc,2); 
      break;

Répondre

1

Attend à moi comme vous êtes confus au sujet de la façon de traiter les angles. Utilisez-vous une échelle [0, 360] pour un cercle complet ou [-180, +180]? Je vois un chèque contre 270 dans votre code, mais votre prose mentionne -90. Oui, ils sont "pareil", mais si ça ne fonctionne pas, peut-être une certaine confusion s'est glissée dans votre code. Si vous partez avec [-180, +180], avec zéro degré comme position neutre pour votre bras de robot, vous pouvez peut-être profiter de la symétrie et utiliser la fonction de valeur absolue. Vous n'avez qu'à le coder une fois de cette façon. Si c'est réussi pour [0, +90] ça marchera aussi pour [-90, 0] aussi.

Il me semble également que vous ne profitez pas de la pensée orientée objet. Cette méthode a le mouvement et la synchronisation et l'actualisation graphique tout dans la même méthode. Ecrire des méthodes plus petites et tester chaque unité pour être sûr que cela fonctionne est une meilleure approche. C'est ce qu'on appelle la "décomposition". Le moment où vous dites «c'est une grande méthode», cela me laisse penser que c'est peut-être trop gros et qu'il faut le refactoriser.

+0

oui j'ai une base circulaire, il peut se déplacer à 360 degrés, je voulais 180 t0 -180 mouvement, j'ai déclaré une variable entière qui se soucie de l'angle. Existe-t-il une meilleure option que l'entier statique pour représenter les angles? –

+0

Alors pourquoi votre code a-t-il des vérifications incluant 270 et 360? Ce n'est pas [-180, +180]. "statique" entier? Entier est bon, mais je ne comprends pas "statique". – duffymo

Questions connexes