#ifdef ARC_SDL #include "arc/graphics/circle.h" #include "arc/graphics/sdl/renderer.h" #include //Modified from https://stackoverflow.com/questions/38334081/how-to-draw-circles-arcs-and-vector-graphics-in-sdl void ARC_Circle_Render(ARC_Circle *circle, ARC_Renderer *renderer, ARC_Color *color){ SDL_SetRenderDrawColor((SDL_Renderer *)renderer, color->r, color->g, color->b, color->a); int32_t diameter = (circle->r * 2); int32_t x = (circle->r - 1); int32_t y = 0; int32_t tx = 1; int32_t ty = 1; int32_t error = (tx - diameter); while(x >= y){ // Each of the following renders an octant of the circle SDL_RenderDrawPoint((SDL_Renderer *)renderer, circle->x + x, circle->y - y); SDL_RenderDrawPoint((SDL_Renderer *)renderer, circle->x + x, circle->y + y); SDL_RenderDrawPoint((SDL_Renderer *)renderer, circle->x - x, circle->y - y); SDL_RenderDrawPoint((SDL_Renderer *)renderer, circle->x - x, circle->y + y); SDL_RenderDrawPoint((SDL_Renderer *)renderer, circle->x + y, circle->y - x); SDL_RenderDrawPoint((SDL_Renderer *)renderer, circle->x + y, circle->y + x); SDL_RenderDrawPoint((SDL_Renderer *)renderer, circle->x - y, circle->y - x); SDL_RenderDrawPoint((SDL_Renderer *)renderer, circle->x - y, circle->y + x); if(error <= 0){ ++y; error += ty; ty += 2; } if(error > 0){ --x; tx += 2; error += (tx - diameter); } } } //TODO: very temp void ARC_Circle_RenderFill(ARC_Circle *circle, ARC_Renderer *renderer, ARC_Color *color){ ARC_Circle temp = *circle; for(; temp.r; temp.r--){ ARC_Circle_Render(&temp, renderer, color); } } #endif // ARC_SDL