Di dalam atau di luar Segitiga

Kalau kalian sudah mempelajari cara mewarnai Segitiga, sekarang kita akan mempelajari cara mengetes apakah suatu titik berada di dalam segitiga. Untuk mengecek apakah suatu titik berada di dalam atau di luar segitiga, kalian bisa menggunakan dua function berikut ini.
float tanda (SDL_Point *p1, SDL_Point *p2, SDL_Point *p3){
    return (p1->x - p3->x) * (p2->y - p3->y) - (p2->x - p3->x) * (p1->y - p3->y);
}

int cekTabrakan (SDL_Point *pt, SDL_Point *v1, SDL_Point *v2, SDL_Point *v3){
    float t1, t2, t3;
    int tabrakan=0;

    t1 = tanda(pt, v1, v2);
    t2 = tanda(pt, v2, v3);
    t3 = tanda(pt, v3, v1);

    if((t1 <= 0 && t2 <= 0 && t3 <= 0) || (t1 >= 0 && t2 >= 0 && t3 >= 0))tabrakan=1;//jika positif+0 semua atau negatif+0 semua
    return tabrakan;
}
function yang perlu dipanggil saat pengecekan koordinat adalah function cekTabrakan. Function tanda digunakan untuk menghitung vektor dan lebih diutamakan nilai positif dan negatifnya. Function cekTabrakan menggunakan pengecekan jarak vektor dari tiap titik segitiga ke posisi pointer mouse. Untuk lebih jelasnya, lebih baik kalian langsung coba saja satukan function-function tersebut dengan kode program utamanya.
#include <SDL2/SDL.h>
#include <math.h>
#define playar 640
#define tlayar 480

SDL_Renderer *trender=NULL;

float tanda (SDL_Point *p1, SDL_Point *p2, SDL_Point *p3){
    return (p1->x - p3->x) * (p2->y - p3->y) - (p2->x - p3->x) * (p1->y - p3->y);
}

int cekTabrakan (SDL_Point *pt, SDL_Point *v1, SDL_Point *v2, SDL_Point *v3){
    float t1, t2, t3;
    int tabrakan=0;

    t1 = tanda(pt, v1, v2);
    t2 = tanda(pt, v2, v3);
    t3 = tanda(pt, v3, v1);

    if((t1 <= 0 && t2 <= 0 && t3 <= 0) || (t1 >= 0 && t2 >= 0 && t3 >= 0))tabrakan=1;//jika positif+0 semua atau negatif+0 semua
    return tabrakan;
}

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 pt={0, 0};
    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)){
                }
  
                pt.x=evt.button.x;
                pt.y=evt.button.y;

                SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0xFF, 0xFF);
                SDL_RenderClear(trender);
  
                if(cekTabrakan(&pt, &stiga[0], &stiga[1], &stiga[2])!=0)
                    SDL_SetRenderDrawColor(trender, 0xFF, 0x00, 0x00, 0xFF);//kalau segitiga dilewati warnanya merah
                else
                    SDL_SetRenderDrawColor(trender, 0x00, 0x00, 0xFF, 0xFF);//kalau segitiga tidak dilewati warnanya biru
  
                warnaiSegitiga(&stiga[0], &stiga[1], &stiga[2]);//gambar segitiga
  
                SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0x00, 0xFF);
                SDL_RenderDrawLines(trender, stiga, 4);
  
                SDL_RenderPresent(trender);
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
Kode program di atas akan menghasilkan program yang menampilkan segitiga. Segitiga tersebut akan berbeda warnanya saat pointer berada di luar dan di dalam segitiga.