Анимация по эллиптическому пути в OpenGL - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь заставить красный круг следовать по пути полукруга, используя алгоритм DDA в OpenGL. У меня это почти получилось, хотя круг немного смещен относительно своей оси X, которая увеличивается с увеличением угла полукруга.

enter image description here enter image description here

Любая помощь будет принята с благодарностью! Вот мой код:

scrPt movecircle (scrPt p1, scrPt p2)
{
    scrPt circlePos;

    float angle, x = p1.x, y = p1.y, vectorX, vectorY;

    // Get tahe x distance between the two points
    int dx = p2.x - p1.x, steps;

    // Get the y distance between the two points
    int dy = p2.y - p1.y;

    // Get the length between the points
    float length = sqrt(dx*dx + dy*dy);

    if (fabs (dx) > fabs (dy)) 
    steps = fabs (dx); 
    else 
        steps = fabs (dy);

    // calculate the direction
    float xIncrement = float (dx) / float (steps); 
    float yIncrement = float (dy) / float (steps); 

    if (nextPos == 0)
    {
        for(int i = 0; i < steps; i++)
        {
            glClear(GL_COLOR_BUFFER_BIT);
            angle = PI * i / steps;
            vectorX = x + (length / 2) * cos(angle + theta);
            vectorY = y + dy / 2 + (length / 2) * sin(angle + theta);
            circlePos.x = round(vectorX - length / 2);
            circlePos.y = round(vectorY);
            drawCircle (circlePos.x, circlePos.y);
            drawArch();
            glFlush();
            usleep(3000);
        }
    }
    else
    {   
        for (int i = 0; i < steps; i++)
        {
            glClear(GL_COLOR_BUFFER_BIT);
            drawCircle (round(x),round(y));
            glFlush();
            usleep(3000);
            x += xIncrement; 
            y += yIncrement;
        }
    }

    return circlePos;
}

1 Ответ

0 голосов
/ 06 сентября 2018

В цикле for произошла пара ошибок, которые вызывали проблему. Мне нужно было изменить

это:

vectorX = x + (length / 2) * cos(angle + theta);

к этому:

vectorX = x + (dx / 2) + (length / 2) * cos(angle + theta);

и это:

circlePos.x = round(vectorX - (length / 2));

к этому:

circlePos.x = round(vectorX);
...