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.
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.
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.
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".