Menggambar dan Mewarnai Segitiga

Saat menggunakan library SDL2, kita bisa menggambar polygon menggunakan SDL_RenderDrawLines atau SDL_RenderDrawLine. Sayangnya, SDL tidak menyediakan fungsi khusus untuk mewarnai poligon atau segi-n. Untuk bisa mewarnai poligon, kita perlu membuat function khusus yang mewarnai poligon tersebut menggunakan sekumpulan garis. Kita bisa mewarnai poligon dengan menarik banyak garis dari salah satu garis ke titik sudut di hadapannya.

Saya tidak akan terlalu banyak berteori. Kalau kalian mau, kalian bisa menganalisa sendiri algoritma dari function yang saya berikan. Function tersebut bisa kalian lihat di bawah ini.
int warnaiSegitiga(SDL_Point *segitiga){
int n, x, y;
float mx, my;
    if(abs(segitiga[0].x-segitiga[1].x) > abs(segitiga[0].y-segitiga[1].y)){
         n=segitiga[1].x-segitiga[0].x;
         mx=segitiga[1].x-segitiga[0].x;
         my=segitiga[1].y-segitiga[0].y;
         for(float i=0;i<n;i++){
             x=i+segitiga[0].x;
             y=segitiga[0].y+(i*my/mx);
             SDL_RenderDrawLine(trender, x, y, segitiga[2].x, segitiga[2].y);
             SDL_RenderDrawLine(trender, x, y+1, segitiga[2].x, segitiga[2].y);//kalau garisnya nggak miring sepertinya ini nggak diperlukan
         }
    }else{
        n=segitiga[1].y-segitiga[0].y;
        mx=segitiga[1].x-segitiga[0].x;
        my=segitiga[1].y-segitiga[0].y;
        for(int i=0;i<n;i++){
            x=segitiga[0].x+(i*mx/my);
            y=i+segitiga[0].y;
            SDL_RenderDrawLine(trender, x, y, segitiga[2].x, segitiga[2].y);
            SDL_RenderDrawLine(trender, x+1, y, segitiga[2].x, segitiga[2].y);//kalau garisnya nggak miring sepertinya ini nggak diperlukan
        }
    }
}
Function tersebut menggunakan pointer bertipe SDL_Point sebagai parameternya. Tiga parameter tersebut adalah titik-titik koordinat segitiga yang akan digambar.

Kode program lebih lengkapnya bisa kalian lihat di bawah ini.
#include <SDL2/SDL.h>
#include <math.h>
#define playar 640
#define tlayar 480

SDL_Renderer *trender=NULL;
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 main(int argc, char* args[]){
    SDL_Window* window = NULL;
    SDL_Event evt;
    SDL_Point stiga[]={{10, 10}, {200, 300}, {300, 50}, {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);
                warnaiSegitiga(&stiga[0], &stiga[1], &stiga[2]);
  
                SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0x00, 0xFF);
                SDL_RenderDrawLines(trender, stiga, 4);
  
                SDL_RenderPresent(trender);
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
Hasil dari kode di atas adalah program yang menampilkan dan mewarnai segitiga sesuai koordinat yang sudah diberikan. Saya tidak perlu memberikan cara mengcompile-nya kalau kalian sudah mempelajari SDL.

Kalian tidak hanya bisa menggunakan function dalam kode program tersebut sekali. Kalian bisa menggunakan function untuk membuat beberapa segitiga berwarna lainnya. Kalau mau, kalian bisa mengubah kode programnya dan coba buat segitiga lainnya.