BAB IV TOOLS UNTUK MENGGAMBAR (WINDOW DAN VIEWPORT)
Menggambar Objek 2D {
Bagaimana cara menggambar objek 2D? z
z
{
Langsung pada layar Æ kesulitan manipulasi yaitu dalam transformasi Melalui sistem koordinat kartesius 2D
Dalam menggambar selalu digunakan perhitungan pixel (bil. bulat positif), padahal kenyataannya bisa bil. pecahan/ negatif yang dinyatakan dalam koord. Cartesius. Æ perlu transformasi dari world window ke viewport.
ViewPort dan World Coordinate/ World Window (Koordinat Nyata)
ViewPort dan World Coordinate/ World Window (Koordinat Nyata) {
{
World Coordinate Daerah segi empat pada sistem koordinat kartesius di mana gambar didefinisikan Viewport Daerah segi empat pada layar di mana gambar akan ditempatkan/ dibuat.
Pemetaan dari World Coordinate ke Viewport
Pemetaan dari World Coordinate ke Viewport {
{
World coordinate dinyatakan dengan w, dan batas kiri (left), kanan (right), atas (top), dan bawah (bottom) masingmasing dinyatakan dengan w.l, w.r, w.t, w.b. Koordinat viewport dinyatakan dengan v, dan batas kiri (left), kanan (right), atas (top), dan bawah (bottom) masingmasing dinyatakan dengan v.l, v.r, v.t, v.b.
Rumus Transformasi {
{
Sumbu sx terhadap x dan sumbu sy terhadap y, masing-masing dinyatakan dengan : sx = Ax + C sy = By + D untuk suatu konstanta A, B, C, dan D. Konstanta A dan B menskala sumbu x dan y, sedangkan C dan D menggeser obyek. Dengan menggunakan perbandingan skala A, B, C, dan D masing-masing dapat dinyatakan sebagai berikut : C = V.l – A W.l V .r − V .l A= W .r − W .l
V .t − V .b B= W .t − W .b
D = V.b – B W.b
Contoh
Contoh {
{
Perhatikan gambar (w.l,w.r,w.t,w.b)= (0, 2.0, 0, 1.0) (v.l,v.r,v.t,v.b)=(40, 400, 60, 300) Dengan menggunakan rumus diperoleh A= 180, C = 40, B = 240, D = 60 Pemetaan dari world ke viewport sx= 180x + 40 sy= 240y + 60
Contoh {
Dalam OpenGL, pemetaan tersebut dinyatakan dengan glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 2.0, 0.0, 2.0); // mengatur window glViewport(40, 60, 360, 240); // mengatur viewport
Poligon (1)
Poligon (2) {
Prinsip dasar: Setiap titik sudut n-gon ( Pi ) mempunyai koordinat :
⎛ 2π i ⎞ ⎛ 2π i ⎞ Pi = ( R cos⎜ ⎟, R sin ⎜ ⎟) ⎝ n ⎠ ⎝ n ⎠ untuk i = 0, 1, …, n-1 dimana π = 3.14159265
Poligon (3) glBegin(GL_LINE_STRIP); glColor3f(0.0, 0.0, 1.0); /* hexagon */ glVertex2f(10.0, 0.0); glVertex2f(10*cos(2*3.14159265*1/6),10*sin(2*3.14159265*1/6)); glVertex2f(10*cos(2*3.14159265*2/6),10*sin(2*3.14159265*2/6)); glVertex2f(10*cos(2*3.14159265*3/6),10*sin(2*3.14159265*3/6)); glVertex2f(10*cos(2*3.14159265*4/6),10*sin(2*3.14159265*4/6)); glVertex2f(10*cos(2*3.14159265*5/6),10*sin(2*3.14159265*5/6)); glEnd();
Poligon (4) void ngon(int n,float cx,float cy,float radius,float rotAngle) double angle , angleInc; int k; if(n < 3) return; // jml sisi tdk memenuhi syarat angle=rotAngle*3.14159265/180; // initial angle angleInc=2*3.14159265/n; //angle increment glVertex2f(radius * cos(angle) + cx, radius * sin(angle)+cy); for(k = 0; k < n; k++) // repeat n times { angle += angleInc; glVertex2f(radius*cos(angle)+cx,radius*sin(angle)+cy); } }
Clipping Garis (1) {
Dalam OpenGL clipping dilakukan secara otomatis. Kalau gambarnya keluar dari window, maka otomatis tidak ditampilkan. Tetapi dalam bab ini akan dipelajari teori untuk membuang obyek diluar bingkai.
Clipping Garis (2) A
B window C
E
D
Clipping Garis (3) 1. 2. 3.
4.
Seluruh garis di dalam window (garis CD). Fungsi mengembalikan nilai 1. Seluruh garis di luar window (garis AB). Fungsi mengembalikan nilai 0. Satu ujung garis di luar dan ujung lainnya di dalam window (garis BC atau DE). Fungsi membuang bagian garis di luar window dan mengembalikan nilai 1. Kedua ujung garis di luar window, tetapi ada bagian garis di dalam window (garis AE). Fungsi memotong kedua ujung di luar window dan mengembalikan nilai 1.
Status P dinyatakan dengan 4 field berikut ini : Kode untuk P : F
window
Apakah P di kiri W
Apakah P di atas W
F
F
F
Apakah P bwh W Apakah P di kanan W
Clipping Garis TTFF
FTFF
FTTF
TFFF
FFFF (window)
FFTF
TFFT
FFFT
FFTT
Clipping Garis {
{
{
Trivial accept kedua titik ujung bernilai FFFF Trivial reject kedua titik ujung mempunyai T pada posisi yang sama, keduanya di kiri, di kanan, di atas, atau di bawah. Untuk memotong garis yang berada di luar window perlu diketahui titik yang berada tepat di batas window.
Rumus Algoritma CohenSutherland {
Karena P1.y’ = A.y dan P1.x’ = A.x = w.kanan, maka diperoleh: P1.y’=P1.y+(w.kanan-p1.x)*dely/delx
Gambar Lingkaran void drawCircle(point2 center, float radius) { const int numVerts = 50; ngon(numVerts, center.getX(), center.getY(), radius, 0); }
Gambar Busur {
Demikian juga dengan menggambar busur. Busur adalah sebagian dari lingkaran. Kalau lingkaran digambar mulai dari titik asal, berputar dan kembali lagi ke titik asal. Kalau busur, digambar mulai dari titik asal berputar setengah lingkaran lalu dihentikan. Selamat mencoba.
Demo Program {
Demo untuk lingkaran dan busur