Garis dibuat dengan menentukan
dua endpoint atau posisi awal dan posisi akhir dari suatu garis. Kmeudian
peralatan output membuat garis sesuai posisi titik titik tersebut. Untuk
peralatan analog seperti plotter an random-scan display garis lurus dapat
dihasilkan dengan halus.
Garis adalah penghubung antara
dua buah titik (titik awal dan titik akhir). Seperti yang kita tahu, bahwa
persamaan garis lurus dinyatakan dalam rumus: y=mx+c. Dimana m adalah gradien
yang didapatkan dari hasil pembagian deltaY dengan deltaX dan c adalah sebuah
konstanta. Berangkat dari sini kita coba mulai untuk membahas algortima apa
saja yang digunakan dalam pembuatan garis lurus.
1. ALGORITMA DDA
A. PENGERTIAN ALGORITMA DDA
Algoritma DDA adalah algoritma
pembentukan garis berdasarkan perhitungan dx maupun dy, menggunakan rumus
dy=m.dx. Semua koordinat titik yang membentuk garis diperoleh dari perhitungan
kemudian dikonversikan menjadi nilai integer.
DDA ( Digital Differential
Analyzer) adalah garis yang membentang antara 2 titik, P1 dan P2. Dimana ke-2
titik ini membentuk sudut yang besarnya sangat bervariasi. Bekerja atas dasar
penambahan nilai x dan nilai y. Dimana pada garis lurus, turunan pertama dari x
dan y adalah kostanta.
B. LANGKAH LANGKAH PEMBENTUKAN GARIS ALGORITMA DDA
1. Tentukan
dua titik yang akan dihubungkan dalam pembentukan garis.
2. Tentukan
salah satu sebagai titik awal (x1, y1) dan titik akhir (x2, y2).
3. Hitung
dx = x2 – x1 dan dy = y2 – y1
4. Tentukan
step, yaitu jarak maksimum jumlah penambahan nilai x atau nilai y, dengan
ketentuan:
a.
bila |dx| > |dy| maka step = |dx|
b.
bila tidak, maka step = |dy|
5.
Hitung penambahan koordinat pixel dengan
persamaan:
x_inc = dx / step
y_inc = dy / step
6.
Koordinat selanjutnya (x+x_inc, y+y_inc)
7.
Plot pixel pada layar, nilai koordinat hasil
perhitungan dibulatkan
8.
Ulangi step nomor 6 dan 7 untuk menentukan
posisi pixel berikutnya sampai x = x1 atau y = y1.
C. KEUNTUNGAN DAN KERUGIAN ALGORITMA DDA
Keuntungan dari
algoritma Digital Differential
Analyzer (DDA) adalah tidak perlu
menghitung koordinat berdasarkan persamaan yang lengkap (menggunakan metode off
set)
Kerugiannya dari algoritma Digital
Differential Analyzer (DDA) adalah adanya akumulasi Round-off
errors, sehingga garis akan melenceng dari garis lurus, selain itu operasi
round-off juga menghabiskan waktu.
D. PENERAPAN ALGORITMA DDA
#define BLACK
0 #include
#include
using namespace std;
void draw_pixel(int ix, int
iy, int value)
{
glBegin(GL_POINTS);
glVertex2i( ix, iy);
glEnd();
}
int bres(int x1,int y1,int
x2,int y2)
{
int dx, dy, i, e;
int incx, incy, inc1, inc2;
int x,y;
dx = x2 - x1;
dy = y2 - y1;
if(dx < 0) dx = -dx;
if(dy < 0) dy = -dy;
incx = 1;
if(x2 < x1) incx = -1;
incy = 1;
if(y2 < y1) incy = -1;
x=x1;
y=y1;
if(dx > dy)
{
draw_pixel(x,y, BLACK);
e = 2*dy - dx;
inc1 = 2*( dy -dx);
inc2 = 2*dy;
for(i = 0; i < dx; i++)
{
if(e >= 0)
{
y += incy;
e += inc1;
}
else e += inc2;
x += incx;
draw_pixel(x,y, BLACK);
}
}
else
{
draw_pixel(x,y, BLACK);
e = 2*dx - dy;
inc1 = 2*( dx - dy);
inc2 = 2*dx;
for(i = 0; i < dy; i++)
{
if(e >= 0)
{
x += incx;
e += inc1;
}
else e += inc2;
y += incy;
draw_pixel(x,y, BLACK);
}
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
bres(200, 200, 100, 50);
glFlush();
}
void myinit()
{
glClearColor(1.0, 1.0, 1.0,
1.0);
glColor3f(1.0, 0.0, 0.0);
glPointSize(1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 499.0, 0.0,
499.0);
}
int main(int argc, char**
argv)
{
glutInit(&argc;,argv);
glutInitDisplayMode
(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("Bresenham's
Algorithm");
glutDisplayFunc(display);
myinit();
glutMainLoop();
}
2. ALGORITMA
BRESENHAM
A.PENGERTIAN ALGORITMA BRESENHAM
Algoritma bresenham merupakan
suatu algoritma (pendekatan) yang dikreasikan oleh bresenham yang tidak kalah
akurat dan efisien dengan algoritma primitif lainnya (seperti DDA). Bagian
pengkonversian (scan-knversi) garis akan melakukan kalkulasi untuk penambahan
nilai-nilai integer (yang dibutuhkan untuk membentuk garis) yang disesuaikan
dengan tipe grafik yang dipakai oleh layar komputer (keadaan monitor pc) kita.
Untuk mengilustrasikan pendekatan bresenham, pertama kita harus memperhatikan
proses scan- konvensi untuk garis dengan slope positif yang lebih kecil dari 1.
Posisi pixel sepanjang line-path kemudian ditentukan dengan penyamplingan pada
unit interval x.dimulai dari endpoint kiri (Xo,Yo) dari garis yang diberikan,
kita pindahkan beberapa kolom berturut-turut (berdasarkan posisi x) dan plot
pixel-pixel yang mempunyai nilai scan-line y ke jarak yang paling dekat dengan
line-path.
B. ATURAN BRESENHAM
·
Jika Pk bernilai positif (+), maka tambahkan
hasilnya dengan B dan nilai x dan y ditambah 1.
·
Jika Pk bernilai negatif (-), maka tambahkan
hasilnya dengan A dan nilai x ditambah 1, sedangkan y ditambah 0 (tetap).
·
Putaran dihentikan jika koordinat x dan y sudah
mencapai batas akhir.
C. PRINSIP DARI ALGORITMA BRESENHAM
1. Sumbu
vertikal memperlihatkan posisi scan line.
2. Sumbu
horizontal memperlihatkan kolom pixel
3. Pada
tiap langkah, penentuan pixel selanjutnya didasari oleh parameter integer yang
nilainya proporsional dengan pengurangan antara vertical separations dari dua
posisi piksel dari nilai actual.
Garis lurus dinyatakan
dinyatakan dalam persamaan :
y = mx + c รจ Persamaan(1)
dimana :
m : gradient dan
c : konstanta.
Untuk menggambarkan piksel-piksel
dalam garis lurus, parameter yang digunakan tergantung dari gradient, jika
besarnya gradient diantara 0 dan 1, maka digunakan sumbu x sebagai parameter
dan sumbu y sebagai hasil dari fungsi, sebaliknya, bila gradient melebihi 1,
maka sumbu y digunakan sebagai parameter dan sumbu x sebagai hasil dari fungsi,
hal ini bertujuan untuk menghindari terjadinya gaps karena adanya piksel yang
terlewatkan. Hasil dari fungsi biasanya merupakan bilangan real, sedangkan
koordinat pixel dinyatakan dalam bilangan integer (x,y), maka diperlukan
operasi pembulatan kedalam bentuk integer terdekat. Penggambaran garis lurus
dengan metode diatas dimulai dengan operasibilangan real untuk menghitung
gradient m dan konstanta c.
m = (y2 – y1 ) / (x2-x1) (2)
c = y1 / m* x1* (3)
Operasi bilangan real berikutnya
adalah menghitung nilai y dengan persamaan (1) Untuk mendapatkan koordinat
piksel (x,y), untuk setiapnilai x, dari =x1 sampai x=x2, operasi inilah yang
perlu dihindari,karena operasi ini memerlukan waktu operasi yang besar.
D. LANGKAH LANGKAH PEMBENTUKAN GARIS ALGORITMA DDA
1.
Tentukan 2 titik yang akan dihubungkan dalam
pembentuk garis.
2.
Tentukan salah satu titik disebelah kiri sebagai
titik awal, yaitu (X0,Y0) dan titik lainnya sebagai titik akhir (X1, Y1)
3.
hitung Dx, Dy, 2DX dan 2Dy-2Dy
4.
Hitung parameter P0= 2Dy – 2Dx
5.
Untuk setiap X1 sepanjang jalur garis, dimulai
dengan k=0,
·
bila pk<0, makatitik selanjutnya adalah (Xk +
1, Yk) dan Pk+1 = Pk +2Dy
·
bila tidak, maka titik selanjutnya adalah (Xk +
1, Yk +1) dan Pk+1 = Pk +2Dy – 2Dx
6.
Ulangi langkah no. 5 untuk menentukan posisi
selanjutnya, sampai X=X1 dan Y=Y1
E. PENERAPAN ALGORITMA BRESENHAM
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
int main()
{
int gd = DETECT, gm;
int dx, dy, p, xakhir;
float x0, x1, y0, y1, x, y;
initgraph(&gd,
&gm,0);
printf("Masukkan Nilai
X0: ");
scanf("%f",
&x0);
printf("Masukkan Nilai
Y0: ");
scanf("%f",
&y0);
printf("Masukkan Nilai
X1: ");
scanf("%f",
&x1);
printf("Masukkan Nilai
Y1: ");
scanf("%f",
&y1);
dx = abs(x1 - x0);
dy = abs(y1 - y0);
p = 2 * dy - dx;
if(x0 > x1)
{
x = x1;
y = y1;
xakhir = x0;
}
else
{
x = x0;
y = y0;
xakhir = x1;
}
while(x < xakhir)
{
x = x + 1;
if(p < 0)
{
p = p + 2 * dy;
}
else
{
y = y + 1;
p = p + 2 * (dy - dx);
}
putpixel(x, y, WHITE);
}
getch();
closegraph();
}
ConversionConversion EmoticonEmoticon