draw recangle and circle

¿ø°ú »ç°¢ÇüÀ» ±×·Áº¸ÀÚ.

½ÇÇà È­¸éÀÌ´Ù.
»ç°¢ÇüÀ» ±×¸®°í ¿ø µÎ°³°¡ ¿·À¸·Î À̵¿ÇÏ´Â ¸ð½ÀÀÌ´Ù.



»ç°¢ÇüÀº SDL_RenderDrawRect·Î SDL API·Î ±×¸®°í ¿øÀº ÀÎÅͳݿ¡¼­ °¡Á®¿Â ÇÔ¼ö·Î ±×·È´Ù.

DrawCircleÀº ¼±À¸·Î ±×¸®´Â ¿øÀÌ´Ù.
DrawCircleFillÀº ä¿öÁø ¿øÀÌ´Ù.

¼³¸íÀº º°µµ·Î ÇÏÁö ¾Ê°í Äڵ常 ÷ºÎÇÑ´Ù.
¿¹Á¦¿Í SDL ¶óÀ̺귯¸®¸¦ °°ÀÌ ¹­¾î¼­ ¿Ã¸°´Ù.

#include <SDL.h>
#include <stdio.h>

void Draw(SDL_Renderer *renderer);

int main( int argc, char *argv[] )
{
    bool success = true;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
        return -1;
    }

    SDL_Window *window = SDL_CreateWindow( "Quadtree",
                        SDL_WINDOWPOS_UNDEFINED,
                        SDL_WINDOWPOS_UNDEFINED,
                        1024,
                        768,
                        0 );

    SDL_Renderer *renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED );


    bool running = true;
    SDL_Event event;
    float mouseX = 0;
    float mouseY = 0;

    int lastAddIndex = 0;

    while ( running )
    {
        while ( SDL_PollEvent( &event ) )
        {
            mouseX = (float)event.button.x;
            mouseY = (float)event.button.y;

            if ( event.type == SDL_QUIT )
            {
                running = false;
            }
            else if ( event.type == SDL_MOUSEBUTTONDOWN )
            {
                if(event.button.button == SDL_BUTTON_LEFT)
                {
                }
                else if(event.button.button == SDL_BUTTON_RIGHT)
                {
                }
            }
            else if ( event.type == SDL_MOUSEBUTTONUP )
            {
                if(event.button.button == SDL_BUTTON_LEFT)
                {
                }
                else if(event.button.button == SDL_BUTTON_RIGHT)
                {
                }
            }
            else if(event.type == SDL_MOUSEMOTION)
            {
                if(event.motion.state & SDL_BUTTON_LMASK)
                {
                }
                else if(event.motion.state & SDL_BUTTON_RMASK)
                {
                }
            }
        }


        Draw(renderer);
    }

    SDL_DestroyRenderer( renderer );
    SDL_DestroyWindow( window );

    return 0;
}

void DrawCircle(SDL_Renderer * renderer, int32_t centreX, int32_t centreY, int32_t radius)
{
   const int32_t diameter = (radius * 2);

   int32_t x = (radius - 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(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);

      if (error <= 0)
      {
         ++y;
         error += ty;
         ty += 2;
      }

      if (error > 0)
      {
         --x;
         tx += 2;
         error += (tx - diameter);
      }
   }
}

void DrawCircleFill(SDL_Renderer *renderer, int x, int y, int radius)
{
    for (int w = 0; w < radius * 2; w++)
    {
        for (int h = 0; h < radius * 2; h++)
        {
            int dx = radius - w; // horizontal offset
            int dy = radius - h; // vertical offset
            if ((dx*dx + dy*dy) <= (radius * radius))
            {
                SDL_RenderDrawPoint(renderer, x + dx, y + dy);
            }
        }
    }
}

int x1 = 0;
int x2 = 600;
int inc1 = 1;
int inc2 = -1;

void Draw(SDL_Renderer *renderer)
{
    /** Log */
    printf("draw...\r\n");

    /** Rendering */
    SDL_SetRenderDrawColor(renderer, 48, 10, 36, 255);
    SDL_RenderClear( renderer );
        
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
    SDL_Rect rect;
    rect.x = 0;
    rect.y = 0;
    rect.w = 200;
    rect.h = 600;
    SDL_RenderDrawRect( renderer, &rect );

    DrawCircle(renderer, x1, 300, 10);
    DrawCircleFill(renderer, x2, 500, 10);

    x1 += inc1;
    x2 += inc2;
    if(x1 >= 600)
        inc1 = -1;  
    if(x1 <= 0)
        inc1 = 1;  
    if(x2 >= 600)
        inc2 = -1;  
    if(x2 <= 0)
        inc2 = 1;  

    SDL_RenderPresent(renderer);
    SDL_Delay( 8 );
}

ÇÁ·ÎÁ§Æ® ´Ù¿î·Îµå : sdl_demo.zip