Menggambar dan Mewarnai Segi-N Beraturan

Sebelumnya, sebenarnya saya pernah membahas cara menggambar segi-n beraturan tanpa isian warna. Kode program yang sudah pernah saya tunjukkan di blog ini menggunakan SDL_RenderDrawLines dan array. Selain dengan cara yang pernah saya tunjukkan tersebut, kalian juga bisa menggunakan SDL_RenderDrawLine yang tidak memerlukan array. Karena tidak menggunakan array dan menggambarkan garisnya satu persatu, maka kalian akan perlu loop / perulangan setiap kalian menggambarnya.
int gambarSegiN(int xpos, int ypos, int r, int n){
float x, y, xprev, yprev, sudut, putaran;
    putaran=0;
    sudut=360/n;
    xprev=cos(0)*r+xpos;
    yprev=sin(0)*r+ypos;
    for(int i=0;i<=n;i++){
        x=cos(grad*putaran)*r+xpos;
 y=sin(grad*putaran)*r+ypos;
 SDL_RenderDrawLine(trender, xprev, yprev, x, y);
 xprev=x;
 yprev=y;
 putaran+=sudut;
 if(putaran>=360)putaran=0;
    }
    return 0;
}
Function di atas hanya menampilkan garis yang membentuk sisi-sisi segi-N beraturan. Sebelum kalian bisa mewarnai segi-N, kalian akan perlu function untuk mewarnai segitiga.
int warnaiSegitiga(SDL_Point *s1, SDL_Point *s2, SDL_Point *s3){
int x, y;
float mx, my;
SDL_Point *tmp;
    if(abs(s1->x-s2->x) > abs(s1->y-s2->y)){
        if(s1->x > s2->x){
            tmp=s1;
            s1=s2;
            s2=tmp;
        }
 
        mx=s2->x-s1->x;
        my=s2->y-s1->y;
        for(int i=0;i<mx;i++){
            x=s1->x+i;
            y=s1->y+(i*my/mx);
            SDL_RenderDrawLine(trender, x, y, s3->x, s3->y);
            SDL_RenderDrawLine(trender, x, y+1, s3->x, s3->y);//kalau garisnya nggak miring sepertinya ini nggak diperlukan
        }
    }else{
        if(s1->y>s2->y){
            tmp=s1;
            s1=s2;
            s2=tmp;
        }
        mx=s2->x-s1->x;
        my=s2->y-s1->y;
        for(int i=0;i<my;i++){
            x=s1->x+(i*mx/my);
            y=s1->y+i;
            SDL_RenderDrawLine(trender, x, y, s3->x, s3->y);
            SDL_RenderDrawLine(trender, x+1, y, s3->x, s3->y);//kalau garisnya nggak miring sepertinya ini nggak diperlukan
        }
    }
}
Sebelum kita membuat function untuk mewarnai segi-N, perhatikan tangkapan layar program berikut ini!
Kalian bisa melihat bahwa segi-N beraturan bisa dipotong jadi beberapa bagian dengan menghubungkan titik pusat segi-N beraturan dengan tiap titik sudutnya. Semua segi-N, poligon atau bangun datar yang hanya terdiri dari sekumpulan garis pada dasarnya bisa dipotong-potong jadi segitiga-segitiga kecil. Karena bisa dibagi jadi beberapa segitiga, sekarang kita bisa mewarnai segi-N beraturan dengan membuat functionnya.
int warnaiSegiN(int xpos, int ypos, int r, int n){
float sudut, putaran;
SDL_Point p1, p2, p3;
    p1.x=xpos;
    p1.y=ypos;
    sudut=360/n;
    putaran=sudut;
    p2.x=cos(0)*r+xpos;
    p2.y=sin(0)*r+ypos;
    for(int i=1;i<=n;i++){
        p3.x=cos(grad*putaran)*r+xpos;
 p3.y=sin(grad*putaran)*r+ypos;
 warnaiSegitiga(&p1, &p2, &p3);
 p2.x=p3.x;
 p2.y=p3.y;
 putaran+=sudut;
 if(putaran>=360)putaran=0;
    }
    return 0;
}
Function di atas perlu function warnaiSegitiga yang sudah saya tunjukkan di atas. Parameternya secara berurutan adalah, koordinat x, koordinat y, radius / ukuran, dan jumlah sisi / titik sudut / segi.

Pewarnaan dengan cara ini hanya berlaku untuk segi-N beraturan. Untuk segi-N beraturan yang lain, kalian perlu function yang lebih rumit. Kalian bisa menjadikannya satu kode program bersama dengan function utama sehingga jadi seperti di bawah ini.
#include <SDL2/SDL.h>
#include <math.h>
#define playar 640
#define tlayar 480
#define grad 3.14285714286/180

SDL_Renderer *trender=NULL;

int gambarSegiN(int xpos, int ypos, int r, int n){
float x, y, xprev, yprev, sudut, putaran;
    putaran=0;
    sudut=360/n;
    xprev=cos(0)*r+xpos;
    yprev=sin(0)*r+ypos;
    for(int i=0;i<=n;i++){
        x=cos(grad*putaran)*r+xpos;
 y=sin(grad*putaran)*r+ypos;
 SDL_RenderDrawLine(trender, xprev, yprev, x, y);
 xprev=x;
 yprev=y;
 putaran+=sudut;
 if(putaran>=360)putaran=0;
    }
    return 0;
}

int warnaiSegitiga(SDL_Point *s1, SDL_Point *s2, SDL_Point *s3){
int x, y;
float mx, my;
SDL_Point *tmp;
    if(abs(s1->x-s2->x) > abs(s1->y-s2->y)){
        if(s1->x > s2->x){
            tmp=s1;
            s1=s2;
            s2=tmp;
        }
 
        mx=s2->x-s1->x;
        my=s2->y-s1->y;
        for(int i=0;i<mx;i++){
            x=s1->x+i;
            y=s1->y+(i*my/mx);
            SDL_RenderDrawLine(trender, x, y, s3->x, s3->y);
            SDL_RenderDrawLine(trender, x, y+1, s3->x, s3->y);//kalau garisnya nggak miring sepertinya ini nggak diperlukan
        }
    }else{
        if(s1->y>s2->y){
            tmp=s1;
            s1=s2;
            s2=tmp;
        }
        mx=s2->x-s1->x;
        my=s2->y-s1->y;
        for(int i=0;i<my;i++){
            x=s1->x+(i*mx/my);
            y=s1->y+i;
            SDL_RenderDrawLine(trender, x, y, s3->x, s3->y);
            SDL_RenderDrawLine(trender, x+1, y, s3->x, s3->y);//kalau garisnya nggak miring sepertinya ini nggak diperlukan
        }
    }
}

int warnaiSegiN(int xpos, int ypos, int r, int n){
float sudut, putaran;
SDL_Point p1, p2, p3;
    p1.x=xpos;
    p1.y=ypos;
    sudut=360/n;
    putaran=sudut;
    p2.x=cos(0)*r+xpos;
    p2.y=sin(0)*r+ypos;
    for(int i=1;i<=n;i++){
        p3.x=cos(grad*putaran)*r+xpos;
 p3.y=sin(grad*putaran)*r+ypos;
 warnaiSegitiga(&p1, &p2, &p3);
 p2.x=p3.x;
 p2.y=p3.y;
 putaran+=sudut;
 if(putaran>=360)putaran=0;
    }
    return 0;
}

int main(int argc, char* args[]){
    SDL_Window* window = NULL;
    SDL_Event evt;
    SDL_Point stiga[]={{10, 10}, {300, 50}, {200, 300}, {10, 10}};

    if( SDL_Init( SDL_INIT_VIDEO ) < 0){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, playar, tlayar, SDL_WINDOW_SHOWN );
        if( window == NULL ){
            printf( "Error : %s", SDL_GetError() );
        }else{
            trender = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
            
            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);
                warnaiSegiN(100, 100, 100, 10);
  
                SDL_SetRenderDrawColor(trender, 0x00, 0x00, 0xFF, 0xFF);
                gambarSegiN(350, 100, 100, 10);
  
                SDL_RenderPresent(trender);
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
Kalian cukup copas kode programnya kalau kalian sudah paham cara menggunakan menggunakan library SDL2. Kalau sudah diketik atau dicopas, selanjutnya compile saja kode programnya. Hasilnya adalah program yang akan menampilkan 2 segi-N yang digambar dengan "cara yang berbeda".