You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SDL2与C实现Bresenham算法画圆的动画方案问询

实现Bresenham圆的逐步绘制动画(SDL版)

你当前的代码是一次性绘制完所有圆的点后才刷新窗口,所以看不到逐步绘制的过程。要实现动画效果,需要在每绘制一组点后立即刷新渲染器,并加入延迟,同时还要处理事件避免窗口假死。

修改要点:

  • 在DrawCircle的循环里,每绘制完一组8个点后,调用SDL_RenderPresent(renderer)更新窗口显示
  • 调用SDL_Delay(ms)设置每组点之间的延迟,参数是毫秒数(比如10-50,数值越小动画越快)
  • 在动画过程中加入事件处理,防止窗口失去响应

修改后的完整代码:

#include <SDL2/SDL.h>
#include <stdio.h>
#define WINDOW_WIDTH 600

void DrawCircle(SDL_Renderer * renderer, int32_t centreX, int32_t centreY, int32_t radius)
{
   int32_t x = 0;
   int32_t y = radius;
   int32_t m = 2 - 2*radius;
   SDL_Event event;

   while (x <= y)
   {
      // 绘制当前八组点
      SDL_RenderDrawPoint(renderer, centreX + x, centreY - y);
      SDL_RenderDrawPoint(renderer, centreX + x, centreY + y);
      SDL_RenderDrawPoint(renderer, centreX - x, centreY - y);
      SDL_RenderDrawPoint(renderer, centreX - x, centreY + y);
      SDL_RenderDrawPoint(renderer, centreX + y, centreY - x);
      SDL_RenderDrawPoint(renderer, centreX + y, centreY + x);
      SDL_RenderDrawPoint(renderer, centreX - y, centreY - x);
      SDL_RenderDrawPoint(renderer, centreX - y, centreY + x);

      // 刷新窗口显示当前绘制的点
      SDL_RenderPresent(renderer);
      // 设置延迟,控制动画速度,这里是10毫秒
      SDL_Delay(10);

      // 处理事件,避免窗口假死
      while(SDL_PollEvent(&event)){
          if(event.type == SDL_QUIT){
              exit(0);
          }
      }
    
      if (m > 0)
      {
         --y;
        m = m + 4*(x-y) + 10;
      }
      else 
         m = m + 4*x + 6;
     ++x;
   }
}


int main(int argc, char** argv)
{
    SDL_Event event;
    SDL_Renderer *renderer;
    SDL_Window *window;

    SDL_Init(SDL_INIT_VIDEO);

    SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_WIDTH, 0, &window, &renderer);
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 修改alpha为255,确保背景完全不透明

    SDL_RenderClear(renderer);

    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);

    DrawCircle(renderer, WINDOW_WIDTH/2, WINDOW_WIDTH/2, 100);

    // 动画完成后保持窗口显示
    while (1) {
        if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
            break;
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return EXIT_SUCCESS;
}

关于SDL_Delay的说明:

SDL_Delay(uint32_t ms)函数会让当前线程暂停指定的毫秒数,参数ms就是你想要延迟的时间。比如SDL_Delay(10)表示暂停10毫秒,调整这个数值可以控制动画的快慢——数值越大,动画越慢;数值越小,动画越快。

注意:如果延迟时间太长,窗口可能会出现卡顿感,一般设置在10-50毫秒之间比较合适。

内容的提问来源于stack exchange,提问作者MoonMiddays

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:50:23