180 до -180 движения в OpenGL C ++? - PullRequest
0 голосов
/ 07 февраля 2010

Я использую glutTimerFunc (...) для достижения движения руки робота, моя проблема в том, что левая сторона 0 градусов до 90 легко решается,

когда я пытаюсь от 0 до -90 градусов, рука не останавливается? я пробовал разные методы, но все ошибались, можете ли вы предложить лучшие варианты?

вот моя функция таймера,

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

<pre><code>    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;
    }

вариант 2: if (плечо> = 360)

        stop2=1;

    if(!stop2)

    {

        shoulder = (shoulder - 5);

        glutPostRedisplay();

        glutTimerFunc(100,myTimerFunc,2);

        break;

    }

// здесь рука робота не останавливается ...........

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



    if(!stop3)

    {

        shoulder = (shoulder + 5);

        glutPostRedisplay();

        glutTimerFunc(100,myTimerFunc,2);

        break;

    }

по умолчанию: разрыв; } }

Я звоню из функции клавиатуры .......

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

        glutTimerFunc(100,myTimerFunc,2);
             break; 

1 Ответ

1 голос
/ 07 февраля 2010

Похоже, ты не понимаешь, как обращаться с углами. Используете ли вы шкалу [0, 360] для полного круга или [-180, +180]? Я вижу чек против 270 в вашем коде, но в вашей прозе упоминается -90. Да, они «одинаковы», но если они не работают, возможно, в ваш код закралась путаница.

Если вы используете [-180, +180] с нулевым градусом в качестве нейтрального положения для руки робота, возможно, вы сможете воспользоваться симметрией и использовать функцию абсолютного значения. Вы должны только кодировать это один раз таким образом. Если он успешен для [0, +90], он также будет работать и для [-90, 0].

Мне также кажется, что вы не пользуетесь объектно-ориентированным мышлением. Этот метод имеет движение и время и графическое обновление все в том же методе. Написание меньших методов и модульное тестирование каждого из них, чтобы убедиться, что это работает, - лучший подход. Это называется "разложение". В тот момент, когда вы говорите «это большой метод», он подсказывает мне, что, возможно, он слишком большой и нуждается в рефакторинге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...