基于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
相关产品推荐
相关产品推荐

