Menggambar dan Mewarnai Lingkaran

Untuk menggambar garis keliling lingkaran ada dua cara yang bisa kita gunakan. Cara yang pertama menggunakan sin dan cos. Sedangkan, cara yang kedua adalah menggunakan pythagoras. Kalau lupa apa itu pythagoras, rumusnya bisa kalian lihat di bawah ini.
  • c2=a2+b2
  • a2=c2-b2
  • b2=c2-a2
Keterangan :
  • c=hipotenusa atau garis miring segitiga siku-siku
  • a dan b = tinggi dan alas segitiga.
Sebelumnya saya sudah pernah membahas cara penggunaan sinus dan cosinus untuk menggambar segi-n di blog ini. Cara tersebut bisa kalian gunakan untuk menggambar "lingkaran palsu" dengan memperbanyak seginya. Sekarang, kita akan menggunakan teorema pythagoras untuk menggambar dan mewarnai lingkaran. Untuk membuat lingkaran dengan teorema pythagoras, kalian bisa menganggap jari-jari atau radius lingkaran sebagai c dalam rumus tersebut. Kalian bisa menggunakan titik x dan y sebagai a dan b-nya.

Kita akan menggunakan dua function. Function yang pertama kita gunakan untuk membuat lingkaran yang bagian dalamnya berwarna. Titik acuan yang kita gunakan di sini adalah titik x yang ditambah satu setiap kali diulang dalam perulangan. Titik y bisa dihitung berdasarkan kuadrat radius yang dikurangi dengan kuadrat titik x, dan hasilnya diakarkan.
int warnai_lingkaran(SDL_Renderer *trender, int xpos, int ypos, int r){
int tx, ty, i;
    for(i=0;i<r;i++){
        tx=i;
        ty=sqrt(r*r-i*i);
        SDL_RenderDrawLine(trender, xpos+tx, ypos+ty, xpos+tx, ypos-ty);
        SDL_RenderDrawLine(trender, xpos-tx, ypos+ty, xpos-tx, ypos-ty);
    }
    return 0;
}
Function berikutnya adalah function yang hanya menampilkan garis keliling lingkaran.
int gambar_lingkaran(SDL_Renderer *trender, int xpos, int ypos, int r){
int tx1, ty1, tx2, ty2, i;
    for(i=0;i<r;i++){
        tx1=i;
        ty1=sqrt(r*r-tx1*tx1);
    
        tx2=i+1;
        ty2=sqrt(r*r-tx2*tx2);
        SDL_RenderDrawLine(trender, xpos+tx1, ypos+ty1, xpos+tx2, ypos+ty2);
        SDL_RenderDrawLine(trender, xpos-tx1, ypos+ty1, xpos-tx2, ypos+ty2);
        SDL_RenderDrawLine(trender, xpos+tx1, ypos-ty1, xpos+tx2, ypos-ty2);
        SDL_RenderDrawLine(trender, xpos-tx1, ypos-ty1, xpos-tx2, ypos-ty2);
    }
    return 0;
}
Kedua function di atas sama-sama menggunakan pythagoras dalam perulangan dengan menggunakan for. Keduanya juga sama-sama menggunakan SDL_Render_DrawLine untuk menggambar lingkaran. Kalau kalian sudah paham, kalian bisa mengembangkan kedua function tersebut untuk membuat tembereng atau seperempat lingkaran hanya dengan membuat sedikit perubahan. Tapi, untuk kali ini kita hanya akan menampilkan lingkaran.

Pada kode program di bawah ini, kita akan gabungkan dan gunakan kedua function tersebut dalam satu program sehingga kita bisa memanggilnya dari function utama atau bagian lain program berkali-kali.
#include <math.h>
#include <SDL2/SDL.h>

int warnai_lingkaran(SDL_Renderer *trender, int xpos, int ypos, int r){
int tx, ty, i;
    for(i=0;i<r;i++){
        tx=i;
        ty=sqrt(r*r-i*i);
        SDL_RenderDrawLine(trender, xpos+tx, ypos+ty, xpos+tx, ypos-ty);
        SDL_RenderDrawLine(trender, xpos-tx, ypos+ty, xpos-tx, ypos-ty);
    }
    return 0;
}

int gambar_lingkaran(SDL_Renderer *trender, int xpos, int ypos, int r){
int tx1, ty1, tx2, ty2, i;
    for(i=0;i<r;i++){
        tx1=i;
        ty1=sqrt(r*r-tx1*tx1);
    
        tx2=i+1;
        ty2=sqrt(r*r-tx2*tx2);
        SDL_RenderDrawLine(trender, xpos+tx1, ypos+ty1, xpos+tx2, ypos+ty2);
        SDL_RenderDrawLine(trender, xpos-tx1, ypos+ty1, xpos-tx2, ypos+ty2);
        SDL_RenderDrawLine(trender, xpos+tx1, ypos-ty1, xpos+tx2, ypos-ty2);
        SDL_RenderDrawLine(trender, xpos-tx1, ypos-ty1, xpos-tx2, ypos-ty2);
    }
    return 0;
}

int main(int argc, char* args[]){
    SDL_Window* window = NULL;
    SDL_Event evt;
    int xpos, ypos, ukuran;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN );
        if( window == NULL ){
            printf( "Error : %s", SDL_GetError() );
        }else{
            SDL_Renderer *trender = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);

            ukuran=100;
            xpos=100;
            ypos=100;

            while(evt.type!=SDL_QUIT){
                while(SDL_PollEvent(&evt)){
                }
                SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0xFF, 0xFF);
                SDL_RenderClear(trender);

                SDL_SetRenderDrawColor(trender, 0xFF, 0x00, 0x00, 0xFF);
                warnai_lingkaran(trender, xpos, ypos, ukuran);
        
                SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0x00, 0xFF);
                gambar_lingkaran(trender, xpos+xpos, xpos+ypos, ukuran);
        
                SDL_RenderPresent(trender);
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}

Contoh di atas bisa juga kalian terapkan pada cukup banyak library yang sejenis dengan SDL. Selain itu banyak hal yang bisa kalian hasilkan kalau kalian memodifikasi kode program di atas.