Asyiknya nge- Clipping [Kuliah Grafika]

April 22, 2008

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);
}
}

Entry Filed under: IF2-an. .

4 Comments Add your own

  • 1. reiSHA  |  April 23, 2008 at 9:24 am

    Nyerah awak kk… Ga ngerti…

    Reply
  • 2. ghifar  |  April 23, 2008 at 11:15 am

    ah, sha pura2 ni, he3.. justru sha yang lebih ngerti

    Reply
  • 3. irfanhanif  |  April 24, 2008 at 4:07 am

    Asik gimana, biasa aja ah -_-.

    Mendingan ngajaks catur far,hoho.

    Reply
  • 4. ray rizaldy  |  April 24, 2008 at 9:45 am

    lho di wordpress ada fitur buat naro kode program ya?
    baru tau huhuhu…

    oi far, baru mampir daku. tukeran link ya

    Reply

Leave a Comment

Required

Required, hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback this post  |  Subscribe to the comments via RSS Feed


Pages

Contact

Yang lagi Ngintip2

page counter

My Personality Type

Click to view my Personality Profile page

Kalender

April 2008
M T W T F S S
« Mar   May »
 123456
78910111213
14151617181920
21222324252627
282930  

Kategori

Komentar Terbaru

ghifar on 1st experience to go overseas:…
fixmanius on 1st experience to go overseas:…
Isan jamaluddin junu… on “Berita dari Masjid Naba…
roelee on Ramalan akan datangnya Imam…
roelee on Ramalan akan datangnya Imam…

Tulisan Tebaru

Tulisan Teratas

Klik tertinggi

Archives

Dosen ITB

IF ITB

Other Friends

Meta

Statistik Blog

RSS PlanetIF