Selasa, 11 Desember 2012

Membuat Garis dengan beberapa metode pada Matlab

Gambar dapat dijelaskan dengan beberapa cara, bila menggunakan raster display, gambar ditentukan oleh satu set intensitas untuk posisi display pada display. Sedangkan dengan scene tampilan gambar dengan loading array dari pixel ke dalam buffer atau dengan mengkonversikan scan dari grafik geometri tertentu ke dalam pola pixel. Paket grafika dilengkapi dengan fungsi untuk menyatakan scene dalam bentuk struktur. Paket pemrograman grafika dilengkapi dengan fungsi untuk menyatakan scene dalam bentuk struktur dasar geometri yang disebut output primitif,dengan memasukkan output primitif tersebut sebagai struktur yang lebih kompleks.

Titik dan Garis 

Pembentukan titik dilakukan dengan mengkonversi suatu posisi titik koordinat dengan program aplikasi ke dalam suatu operasi tertentu menggunakan output. Random-scan (vektor ) system menyimpan instruksi pembentukan titik pada display list dan nilai koordinat menentukan posisi pancaran electron ke arah lapisan fosfor pada layer. Garis dibuat dengan menentukan posisi titik diantara titik awal dan akhir dari suatu garis.

Algoritma garis DDA 

DDA adalah algoritma pembentukan garis berdasarkan perhitungan x dan y, menggunakan rumus y = m. x. Garis dibuat dengan menentukan dua endpoint yaitu titik awal dan titik akhir. Setiap koordinat titik yang membentuk garis diperoleh dari perhitungan, kemudian dikonversikan menjadi nilai integer. Langkah-langkah pembentukan menurut algoritma DDA, yaitu :
1. Tentukan dua titik yang akan dihubungkan.
2. Tentukan salah satu titik sebagai titik awal (x0, y0) dan titik akhir (x1, y1).
3. Hitung x = x1 - x0 dan y = y1 - y0. 4.
 Tentukan step, yaitu jarak maksimum jumlah penambahan nilai x maupun nilai y dengan cara :
bila nilai | y| > | x| maka step = nilai | y|. bila tidak maka step = | x|.
5. Hitung penambahan koordinat pixel yaitu x_increment = x / step dan y_increment = y / step.
6. Koordinat selanjutnya (x+x_incerement, y+y_increment).
7. Posisi pixel pada layer ditentukan dengan pembulatan nilai koordinasi tersebut.
8. Ulangi step 6 dan 7 untuk menentukan posisi pixel selanjutnya, sampai x = x1 dan y = y

Implementasi Membuat garis dengan DDA adalah sebagai berikut :
Kali ini saya menggunakan Matlab versi 2012a (Download)

Hasil akan seperti gambar berikut :


Algoritma Garis Bressenhem 


Prosedur untuk menggambar kembali garis dengan membulatkan nilai x atau y kebilangan integer membutuhkan waktu, serta variable x,y dan m merupakan bilangan real karena kemiringan merupakan nilai pecahan. Bressenham mengembangkan algoritma klasik yang lebih menarik, karena hanya menggunakan perhitungan matematika dengan bilangan integer. Dengan demikian tidak perlu membulatkan nilai posisi setiap pixel setiap waktu. Algoritma garis Bressenhem disebut juga midpoint line algorithm adalah algoritma konversi penambahan nilai integer yang juga dapat diadaptasi untuk menggambar sebuah lingkaran. 

Langkah-langkah untuk membentuk garis menurut algoritma ini adalah : 

  1. Tentukan dua titik yang akan dihubungkan dalam pembentukan garis. 
  2. Tetukan salah satu titik disebelah kiri sebagai titik awal (x 0, y 0 ) dan titik lainnya sebagai titik akhir (x1,y1 ). 
  3. Hitung x, y, 2 x, dan 2 y – 2 x. 
  4. Hitung parameter p0 = 2 y – x. 
  5. Untuk setiap xk sepanjang jalur garis, dimulai dengan k = 0 bila bila pk <0 maka titik selanjutnya (xk+1,yk) dan pk+1 = pk +2 y bila tidak maka titik selanjutnya adalah (xk +1, yk +1) dan pk+1 = pk +2y–2 x.
  6. Ulangi langkah nomor 5 untuk menentukan posisi pixel selanjutnya, sampai x = x1 dan y = y
Implementasi Membuat garis dengan DDA adalah sebagai berikut :
1. buat file dengan nama bresenham_line
2. kita buat functionnya.
---------------------------------------------------------------------------

function bresenham_line()
clc
clear all
point = input('Input Koordinat[ x0 y0 x1 y1]: ');
x0 = point(1);
y0 = point (2);
x1 = point(3);
y1 = point (4);

if (abs(point(4)-point(2)) > abs(point(3)-point(1)))       % If the line is steep                                
    x0 = point(2);y0 = point(1); x1 = point(4);y1=point(3);% then it would be converted to 
    token =1;                                              % non steep by changing coordinate
else
    x0 = point(1);y0 = point(2); x1 = point(3);y1=point(4);
    token = 0; 
end
if(x0 >x1)
    temp1 = x0; x0 = x1; x1 = temp1;
    temp2 = y0; y0 = y1; y1 = temp2;
end
dx = abs(x1 - x0) ;                              % Distance to travel in x-direction
dy = abs(y1 - y0);                               % Distance to travel in y-direction
sx = sign(x1 - x0);                              % sx indicates direction of travel in X-dir
sy = sign(y1 - y0);                              % Ensures positive slope line

clf, subplot(2,1,1) ,hold on , grid on ,axis([x0-1 x1+1 y0-1 y1+1]);
title('Bresenham Line Generation Algorithm: Point form')
x = x0; y = y0;                                  % Initialization of line
param = 2*dy - dx ;                              % Initialization of error parameter
for i = 0:dx-1                                   % FOR loop to travel along X
    x_coord(i+1) = x;                            % Saving in matrix form for plot
    y_coord(i+1) = y;
    if (token ==0)                               % Plotting in point form 
        plot(x,y,'r*');                          % For steep line coordinate is again
    else                                         % converted for actual line drawing.
        plot(y,x,'r*');
    end
    param = param + 2*dy;                        % parameter value is modified
    if (param >0)                                % if parameter value is exceeded
        y = y +1*sy;                             % then y coordinate is increased
        param = param - 2*(dx );                 % and parameter value is decreased
        
    end
    x = x + 1*sx;                                % X-coordinate is increased for next point
end
subplot(2,1,2)                                   % Plotting in line fragment form
if (token ==0)
    plot(x_coord,y_coord,'r-','LineWidth',2);
else
    plot(y_coord,x_coord,'r-','LineWidth',2);
end
grid on
axis([x0-1 x1+1 y0-1 y1+1]);
title('Bresenham Line Generation Algorithm: Line fragment form')

Hasil Implementasi :

---------------------------------------------------------------------------------------


6 komentar:

  1. Mas, saya udah nyoba gunain file source code yang bresenham dari artikel mas di atas. Tapi hasilnya rada' kurang tepat.
    x0 dan y0nya koordinatnya tepat.
    Tapi x1 dan y1nya koordinatnya ga tepat, kurang 1 poin.

    Kenapa ya mas?
    Mohon penjelasannya. Apakah memang ada yg error dari source codenya?

    Kirim jawabannya ke email saya ya mas klo mas ga keberatan.
    yusrizal.ihya@gmail.com

    Makasih banget mas :)

    BalasHapus
  2. Eh maaf, rupanya yang punya blog ini mbak, bukan mas :D

    mohon bantuannya ya mbak atas pertanyaan saya tentang bresenham algorithm.

    Thank's :)

    BalasHapus
  3. terim kasih koreksinya, tapi saat program saya jalankan tidak ada masalah. mungkin saat memasukkan koordinat blum sesyai format yg diminta. contoh : [x0 y0 x1 y1].

    BalasHapus
  4. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  5. mohon pencerahannya
    di matlab 7.1
    kok tidak mau running

    BalasHapus
  6. mbak gimana cara runningnya ya ?saya copy terus run ga jalan mbak

    BalasHapus