Как бы я очистил перевернутые изображения из SDL_surface для следующей итерации?

0

Я пытаюсь имитировать простой маятник с использованием библиотеки SDL. Мне нужно обновить экран новыми итерационными значениями и удалить уже существующее изображение на экране. Как мне это сделать?

Изображение 174551

Мой код выглядит следующим образом

const double g = 9.81, l = 200.0, h = 0.5, u0 = 0, theta0 = 3.1415/3;
const int xoffset = 350, yoffset = 300, r = 10;


//simplified equations 1
double thetadot(double u)
{
    return u;
}

//simplified equations 2
double udot(double theta)
{
    return (-g / l) * sin(theta);
}


int main(int argc, char *argv[])
{
    double theta, thetanext, u, unext, ku1, ku2, ku3, ku4, kt1, kt2, kt3, kt4;
    if (SDL_Init(SDL_INIT_VIDEO) != 0)
        return 1;

    atexit(SDL_Quit);
    SDL_Surface *screen = SDL_SetVideoMode(width, height, 0, SDL_DOUBLEBUF);
    if (screen == NULL)
        return 2;
    //putting inital values to the function
    u = u0;
    theta = theta0;

    while(true)
    {
        SDL_Event event;
        while(SDL_PollEvent(&event))
        {
            if(event.type == SDL_QUIT)
                return 0;
        }

        double x = xoffset + l * sin(theta);
        double y = yoffset + l * cos(theta);

        SDL_LockSurface(screen);

        //string hanging position
        draw_circle(screen, xoffset, yoffset, 10, 0x0000ff00);
        fill_circle(screen, xoffset, yoffset, 10, 0x0000ff00);

        //draw string
        draw_line(screen, xoffset, yoffset, x, y, 0xff3366ff);

        //draw bob current position
        fill_circle(screen, (int)x, (int)y, r, 0xff004400);
        draw_circle(screen, (int)x, (int)y, r, 0xff3366ff);

        SDL_Delay(150);
        SDL_Flip(screen);

        //Numerical integration of equation 1
        kt1 = thetadot(u);
        kt2 = thetadot(u + 0.5 * h * kt1);
        kt3 = thetadot(u + 0.5 * h * kt2);
        kt4 = thetadot(u + h * kt3);
        thetanext = theta + (h / 6) * (kt1 + 2 * kt2 + 2 * kt3 + kt4);

        //Numerical integration of equation 2
        ku1 = udot(theta);
        ku2 = udot(theta + 0.5 * h * ku1);
        ku3 = udot(theta + 0.5 * h * ku2);
        ku4 = udot(theta + h * ku3);
        unext = u + (h / 6) * (ku1 + 2 * ku2 + 2 * ku3 + ku4);

        //updating values
        u = unext;
        theta = thetanext;
    }
    return 0;
}
  • 0
    Хлоп! SDL_FreeSurface(screen); SDL_Flip(screen);
  • 0
    Это даже работает? Я имею в виду, не сбой, потому что в теории это должно произойти сбой. В любом случае, используйте SDL_FillRect в начале кадра вместо неправильного SDL_FreeSurface в конце.
Показать ещё 10 комментариев
Теги:
simulation
sdl

1 ответ

2
Лучший ответ

Вы можете попробовать очистить экран, используя SDL_FillRect, прежде чем рисовать на нем каждый кадр:

int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);

Например, вы можете передать ему параметры SDL_FillRect(screen, NULL, 0x000000) чтобы очистить весь экран черный.

  • 0
    Единственно возможный ответ. Немного побочной теории, но все же я бы добавил это - нет такой вещи, как «ясно». Этот пример заполняет черным. Это будет иметь значение, когда, например, весь экран будет обновляться в каждом кадре - тогда заполнение черным станет излишним.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню