210 likes | 584 Views
KOMPUTER GRAFIK Algoritma Garis Naïve dan DDA. Garis Dinyatakan dengan 4 nilai : x1,y1,x2,y2 Koordinat / titik awal (x1,y1) Koordinat / titik akhir (x2,y2). m = gradien / kemiringan garis. Persamaan garis lurus :Y = mx + c M : gradien C : konstanta
E N D
KOMPUTER GRAFIK AlgoritmaGarisNaïve dan DDA
Garis • Dinyatakandengan 4 nilai : x1,y1,x2,y2 • Koordinat/ titikawal (x1,y1) • Koordinat/ titikakhir (x2,y2) m = gradien / kemiringangaris
Persamaangarislurus :Y = mx + c • M : gradien • C : konstanta • Garisdikelompokkankedalam 3 bentuk : cenderungtegak (m>1), miring 45 derajat (m=1) dancenderungmendatar (0<m<1)
Naïve Idea • Menentukantitik-titikgarispenghubungkoordinatawaldanakhir • Dimulaidari (x, y), untukmenentukantitikselanjutnya, koordinat x diincrementsebanyak 1 dankoordinat y dihitungsebagaiy=m*x+c • Kelemahan : Komputasitinggi, tidakefisien for x from x0 to xend Compute y=mx+b Draw_fn(x, round(y))
Naive Idea void NaiveLine(int x0,int y0,int xend,intyend,int color) int x; float y, m, b; m=(yend-y0)/(xend-x0); b = y0 – m*x0; for (x=x0; xxend;x++) drawpixel (x, int(y+0.5), color); y=m*x+b; Costly floating point computations !! Multiplications, additions, roundings
DDA (Digital Differential Analyzer) Algorithm • Increment • Jika m<1 (gariscenderungmendatarpadakuadran 1 ,oktan 1) maka x sebagaiiterator. • For • Dimulaidarix=x0 and y=y0, setiapposisi(x,y) dihitungdenganmelakukan increment xsebanyak1 danysebanyakm-> x sebagaiiterator
Example:draw segment, octant 1 x y int(y+0.5) 0 0 0 1 0+0.4 0 2 0.4+0.4 1 3 0.8+0.4 1 4 1.2+0.4 2 5 1.6+0.4 2 round
Draw segment, octant 2 • Jika m> 1, gariscenderungtegakpadakuadran 1, oktan 2, maka yang jadiiteratornyaadalah y • y di-incremet 1 dan x di-increment 1/m • Bagaimanamengimplementasikanpada program?
DDA (Digital Differential Analyzer) Algorithm BerikutiniadalahalgoritmaDDA untukkuadran 1, oktan 1 dan 2 • Tentukan2 buahtitik. • Tentukan yang menjadi titik awal (X0,Y0) dan titik akhir (X1,Y1). • HitungDx dan Dy dimana Dx= X1-X0 dan Dy= Y1–Y0 • BandingkanAbs(Dx) dan Abs(Dy). JikaAbs(Dx) > Abs(Dy) maka Steps = Abs(Dx) bilatidak Steps = Abs(Dy) • Hitungpenambahankoordinat pixel, yaitu: X_increment= dx/steps, danY_increment= dy/steps. • Koordinatselanjutnya, yaituX+X_incrementdanY+Y_increment • Posisipixel ditentukandenganpembulatannilaikoordinattersebut. • Ulangilangkah 6 dan 7 untukposisiselanjutnyasampai X = X1, Y = Y1
•Hasildarifungsi : bilanganriil • •Koordinat pixel : integer • •Harusdibulatkankedalam integer terdekat
Contoh Diketahui2 buahtitik A(10,10) dantitik B(17,16), bilatitik A sebagaititikawaldantitik B sebagaititikakhirmakabuatlahgaris yang menghubungkantitiktersebutdenganmenggunakanalgoritma DDA.
Jawab • Titikawal = A(10,10) • Titikakhir = B(17,16) • Dx= X1-X0 = 17 –10 = 7 • Dy= Y1-Y0 = 16 –10 = 6 • Absolut(Dx) = 7 • Absolut(Dy) = 6 • Absolut (Dx) > absolute (Dy) maka steps = Absolut(Dx) = 7 • X_increment= =7/7 = 1 • Y_increment= = 6/7 = 0,86
X1 = X + X_increment= 10 + 1 =11 Y1 = Y + Y_increment= 10 + 0,857 = 10,857 =11 • K X Y X_incY_in • - - - 10 10 • 1 11 10,86 11 11 • 2 12 11,71 12 12 • 3 13 12,57 13 13 • 4 14 13,43 14 13 • 5 15 14,29 15 14 • 6 16 15,14 16 15 • 7 17 16 17 16
Contoh Diketahui2 buahtitik A(10,10) dantitikB(16,17), bilatitik A sebagaititikawaldantitik B sebagaititikakhirmakabuatlahgaris yang menghubungkantitiktersebutdenganmenggunakanalgoritma DDA.
Jawab • Titikawal = A(10,10) • Titikakhir = B(16,17) • Dx= X1-X0 = 16–10 = 6 • Dy= Y1-Y0 = 17 –10 = 7 • Absolut(Dx) = 6 • Absolut(Dy) = 7 • Absolut (Dy) > absolute (Dx) maka steps = Absolut(Dy) = 7 • X_increment= 6/7 = 0,86 • Y_increment= 7/7 = 1
Y1 = Y + Y_increment= 10 + 1 =11 X1 = X + X_increment= 10 + 0,857 = 10,857 =11 • K X Y X_incY_in • - - - 10 10 • 1 10,86 111011 • 2 11,71 121112 • 3 12,57 131313 • 4 13,43 141314 • 5 14,29 151415 • 6 15,14 161516 • 7 16 171617
Kelemahan • Hanyadapatdigunakanuntuknilai x1<x2 dan y1<y2 (kuadran I) • Menggunakanpembagiansertapembulatansehinggakurangakurat
Membuattitik • #include<GL/glut.h> • #include<stdlib.h> • #include<math.h> • void setPixel(intpx, intpy) • { • glBegin(GL_POINTS); • glVertex2i(px, py); • glEnd(); • } • void display() • { • glClear(GL_COLOR_BUFFER_BIT); • glColor3f(1.0,0.0,0.0); • glPointSize(4.0); • // Draws points (100,100) and (200,200). • setPixel(100, 100); setPixel(200, 200); • glFlush(); • }
void init(void) • { • //set display-window background color to white • glClearColor(1.0,1.0,1.0,0.0); • //set projection paramaters • glMatrixMode(GL_PROJECTION); • gluOrtho2D(0.0,300.0,0.0,300.0); • } • main(intargc, char**argv) • { • //initialize GLUT • glutInit(&argc,argv); • //initialize display mode • glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); • //set display-window width & height • glutInitWindowSize(500,500); • //set display-window upper-left position • glutInitWindowPosition(0,0); • //create display-window with a title • glutCreateWindow("Digital Differential Analyzer Algorithm: Programmed by Salha"); • //initialze OpenGL • init(); • //call graphics to be displayed on the window • glutDisplayFunc(display); • //display everything and wait • glutMainLoop(); • }
Latihan 1 • Modifikasilah program titikdiatassesuaidenganalgoritma DDA sehingga program bisamenggambarbeberapatitikmembentukgarisdarisuatukoordinatawaldanakhir. Untukmembulatkangunakanfungsiberikut • int round (float a) • { • return int (a+0.5); • }
Latihan 2 • Modifikasilah program diatassesuaidenganalgoritma Naive sehingga program bisamenggambarbeberapatitikmembentukgarisdarisuatukoordinatawaldanakhir. Untukmembulatkangunakanfungsiberikut