Asyiknya nge- Clipping [Kuliah Grafika]


Ini dia prosedur untuk nge-clip sebuah garis. Algoritma yang digunakan ialah algoritma Cohen-Sutherland. Prosedur ini hanya menggambar sebuah garis di sebuah kotak yang tepat(canvas) walaupun salah satu atau kedua dari titik ujung garis tersebut terdefinisi berada di luar daerah kotak. Titik kiri atas kotak tersebut direpresentasikan dengan Point winMin, dan titik kanan bawahnya di representasikan dengan Point winMax. Sedangkan, titik2 ujung dari garisnya direpresentasikan dengan Point P1 dan P2.

Ide dasar dari algoritma ini ialah membagi-bagi daerah layar monitor menjadi 9 kotak (matriks 3×3). Kotak yang tengah merupakan kotak tempat menggambar garis atau canvas. Langkah-langkah penggambaran garisnya adalah sebagai berikut.

  1. Jika kedua titik ujung garis berada di daerah canvas, maka garis langsung di gambar.
  2. Jika salah satu atau kedua titik ujung dari garis berada di luar wilayah canvas, maka titik tersebut akan digeser menuju canvas sedemikian rupa sehingga memotong garis batas dari canvas, setelah itu garis baru di gambar. Titik potong tersebut harus tetap berada/dilewati oleh garis yang akan digambar.

Berikut ini prosedur clipLine yang menggambar garis dengan menggunakan mekanisme Clipping.

void clipLine(Point winMin, Point winMax, Point P1, Point P2, byte warna){
/* Prosedur untuk menggambar garis hanya pada window yang terdefinisi */
byte code1, code2;
int done = 0;
int draw = 0;
float m; /* gradien */

while(!done){
code1 = encode(P1, winMin,winMax);
code2 = encode(P2, winMin,winMax);
if(TERIMA(code1,code2)){ /*jika kedua titik ujung garis berada di daerah canvas */
done = 1;
draw = 1;
}
else{/* jika salah satu / kedua titik ujunga garis tidak berada di daerah canvas */
if(TOLAK(code1,code2)){
done = 1;
}
else{/* Kedua titik tidak langsung diterima namun tidak juga ditolak*/
/* Pastikan P1 harus diluar window*/
if(DIDALAM(code1)){
swapKode(&code1,&code2);
swapPoint(&P1,&P2);
}
/* Gunakan gradien untuk menghitung titik potong antara garis yang akan digambar dengan sisi window */
if(P1.x != P2.x){
m = (float)(P2.y - P1.y)/(float)(P2.x - P1.x);
}
if(code1 & DAERAH_KIRI){/* Jika P1 di daerah kiri */
P1.y += ((float)(winMin.x - P1.x))*m;
P1.x = winMin.x;
}
else{/* Jika P1 bukan di daerah kiri*/
if(code1 & DAERAH_KANAN){ /* Jika P1 di daerah kanan */
P1.y += ((float)(winMax.x - P1.x))*m;
P1.x = winMax.x;
}
else{/* Jika P1 bukan di daerah kiri dan kanan */
if(code1 & DAERAH_ATAS){/* Jika P1 di daerah atas*/
/* P1 perlu di-update, jika garis tidak berbentuk vertikal sempurna */
if(P1.x !=P2.x){
P1.x += ((float)(winMin.y - P1.y))/m;
}
P1.y = winMin.y;
}
else{/* Jika P1 di daerah bawah */
/* P1 perlu di-update, jika garis tidak berbentuk vertikal sempurna */
if(P1.x !=P2.x){
P1.x += ((float)(winMax.y - P1.y))/m;
}
P1.y = winMax.y;
}
}
}
}
}
}
if(P1.x == winMin.x) P1.x = P1.x + 1;
if(P1.x == winMax.x) P1.x = P1.x - 1;
if(P1.y == winMin.y) P1.y = P1.y + 1;
if(P1.y == winMax.y) P1.y = P1.y - 1;
if(P2.x == winMin.x) P2.x = P2.x + 1;
if(P2.x == winMax.x) P2.x = P2.x - 1;
if(P2.y == winMin.y) P2.y = P2.y + 1;
if(P2.y == winMax.y) P2.y = P2.y - 1;

if(draw){
plot_lines_bresenham(BULAT(P1.x),BULAT(P1.y),BULAT(P2.x), BULAT(P2.y),warna);
}
}

4 thoughts on “Asyiknya nge- Clipping [Kuliah Grafika]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s