Transcript Document
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
Garis dikelompokkan ke dalam 3 bentuk : cenderung
tegak (m>1), miring 45 derajat (m=1) dan cenderung
mendatar (0<m<1)
Naïve Idea
Menentukan titik-titik garis penghubung koordinat
awal dan akhir
Dimulai dari (x, y), untuk menentukan titik
selanjutnya, koordinat x diincrement sebanyak 1 dan
koordinat y dihitung sebagai y=m*x+c
Kelemahan : Komputasi tinggi, tidak efisien
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,int yend,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);
Costly floating point
y=m*x+b;
computations !!
Multiplications, additions,
roundings
DDA (Digital Differential
Analyzer) Algorithm
Increment
yi 1 m xi 1 b
m( xi x) b
m xi b mx
yi mx
Jika m<1 (garis cenderung mendatar pada kuadran
1 ,oktan 1) maka x sebagai iterator.
For x 1 yi 1 yi m
Dimulai dari x=x0 and y=y0, setiap posisi (x,y) dihitung
dengan melakukan increment x sebanyak 1 dan y
sebanyak m -> x sebagai iterator
Example:draw segment, octant 1
P0 (0, 0) Pend (5, 2)
x
0
1
2
3
4
5
y
0
0+0.4
0.4+0.4
0.8+0.4
1.2+0.4
1.6+0.4
int(y+0.5)
0
0
1
1
2
2
round
Line: P0(0, 0)-- P1(5, 2)
3
2
1
0
1
2
3
4
5
Draw segment, octant 2
Jika m> 1, garis cenderung tegak pada kuadran 1, oktan
2, maka yang jadi iteratornya adalah y
y di-incremet 1 dan x di-increment 1/m
Bagaimana mengimplementasikan pada program?
DDA (Digital Differential Analyzer) Algorithm
Berikut ini adalah algoritma DDA untuk kuadran 1, oktan 1 dan 2
Tentukan 2 buah titik.
Tentukan yang menjadi titik awal (X0,Y0) dan titik akhir (X1,Y1).
Hitung Dx dan Dy dimana Dx= X1-X0 dan Dy= Y1–Y0
Bandingkan Abs(Dx) dan Abs(Dy). Jika Abs(Dx) > Abs(Dy) maka
Steps = Abs(Dx) bila tidak Steps = Abs(Dy)
Hitung penambahan koordinat pixel, yaitu: X_increment =
dx/steps, dan Y_increment = dy/steps.
Koordinat selanjutnya, yaitu X+X_increment dan Y+Y_increment
Posisi pixel ditentukan dengan pembulatan nilai koordinat
tersebut.
Ulangi langkah 6 dan 7 untuk posisi selanjutnya sampai X = X1, Y
= Y1
•Hasil dari fungsi : bilangan riil
•Koordinat pixel : integer
•Harus dibulatkan ke dalam integer terdekat
Contoh
Diketahui 2 buah titik A(10,10) dan titik
B(17,16), bila titik A sebagai titik awal dan
titik B sebagai titik akhir maka buatlah garis
yang menghubungkan titik tersebut dengan
menggunakan algoritma DDA.
Jawab
Titik awal = A(10,10)
Titik akhir = 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
1
2
3
4
5
6
7
X
11
12
13
14
15
16
17
Y
10,86
11,71
12,57
13,43
14,29
15,14
16
X_inc Y_in
10
10
11
11
12
12
13
13
14
13
15
14
16
15
17
16
Contoh
Diketahui 2 buah titik A(10,10) dan titik
B(16,17), bila titik A sebagai titik awal dan
titik B sebagai titik akhir maka buatlah garis
yang menghubungkan titik tersebut dengan
menggunakan algoritma DDA.
Jawab
Titik awal = A(10,10)
Titik akhir = 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
1
2
3
4
5
6
7
X
10,86
11,71
12,57
13,43
14,29
15,14
16
Y
11
12
13
14
15
16
17
X_inc Y_in
10
10
10
11
11
12
13
13
13
14
14
15
15
16
16
17
Kelemahan
Hanya dapat digunakan untuk nilai x1<x2 dan y1<y2
(kuadran I)
Menggunakan pembagian serta pembulatan sehingga
kurang akurat
Membuat titik
#include<GL/glut.h>
#include<stdlib.h>
#include<math.h>
void setPixel(int px, int py)
{
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(int argc, 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 titik di atas sesuai dengan
algoritma DDA sehingga program bisa menggambar
beberapa titik membentuk garis dari suatu koordinat
awal dan akhir. Untuk membulatkan gunakan fungsi
berikut
int round (float a)
{
return int (a+0.5);
}
Latihan 2
Modifikasilah program di atas sesuai dengan algoritma
Naive sehingga program bisa menggambar beberapa
titik membentuk garis dari suatu koordinat awal dan
akhir. Untuk membulatkan gunakan fungsi berikut