Algoritma Digital Differential Analyzer untuk Pencitraan Garis pada Komputer

Dalam mencitrakan garis di layar komputer yang berupa sebuah matriks dari piksel-piksel, akan ditemukan masalah jika garis yang akan ditampilkan tidak bersudut 0 atau 45 atau 90 dari garis normal Y=0 (dalam hal ini garis yang ditempatkan di kuadran I) . Masalahnya adalah dalam menentukan piksel berikutnya yang akan diisi dalam mencitrakan persepsi garis. Jika pada garis bersudut 0 dari garis normal Y=0, kita tinggal mengisi piksel demi piksel secara mendatar, jika pada garis bersudut 90 dari garis normal Y=0, kita tinggal mengisi piksel demi piksel secara vertikal, jika pada garis bersudut 45 dari garis normal Y=0 kita tinggal mengisi piksel demi piksel secara diagonal. Pada garis dengan sudut lain kita perlu menggunakan algoritma khusus dalam menentukan piksel manakah yang akan diisi selanjutnya.

Pengisian Piksel pada Pencitraan Garis pada Komputer

Pengisian Piksel pada Pencitraan Garis pada Komputer

Algoritma Digital Differential Analyzer (DDA) adalah salah satu algoritma yang dipakai untuk pencitraan pada komputer. Walau bukan algoritma yang paling baik, apalagi ketika dipakai dalam mencitrakan kurva atau lingkaran, namun pada pencitraan garis algoritma DDA memiliki kecepatan perhitungan yang bisa bersaing dengan algoritma-algoritma lainnya seperti algoritma Bresenham dan algoritma Mid Point.

Konsep pada algoritma DDA adalah konsep dasar persamaan garis yaitu y=m.x+b di mana m adalah kemiringan dari garis yang dibentuk dari dua titik yaitu (x0,y0) dan (x1,y1) lalu untuk setiap iterasi (x=x0, x<=x1, x++) akan didapatkan nilai penambahan nilai y sebesar dy=m.dx.

Urutan langkahnya adalah sebagai berikut:

  1. Tentukan dua titik yang akan dihubungkan dalam pembentukan garis (xo, yo) dan (x1,y1).
  2. Hitung dx = x1-x0, dan dy = y1-y0.
  3. Tentukan r, yaitu jarak maksimum jumlah penambahan nilai x dan nilai y, dengan ketentuan sebagai berikut:
    • Bila nilai absolut dx lebih besar dari absolut dy, maka r = nilai absolut dari dx.
    • Selain itu, maka r = nilai absolut dari dy.
  4. Hitung penambahan koordinat pixel, yaitu xI = dx/r, dan yI = dy/r.
  5. Koordinat selanjutnya adalah (x+xI, y+yI)
  6. Posisi pixel yang diisi dari koordinat selanjutnya tersebut adalah pembulatan dari koordinat tersebut.
  7. Terus ulangi langkah 5 dan 6 untuk menentukan piksel yang diisi selanjutnya sampai x=x1 dan y=y1.

Jika kita lihat algoritma di atas, perlu ada proses pembulatan pada setiap iterasi perhitungan. Inilah yang menjadi kelemahan pada algoritma DDA, karena jika tidak ada fungsi khusus pada pembulatan ini yang dapat meringankan pekerjaan pembulatan ini, maka pembulatan ini adalah yang menjadi beban komputasi yang paling besar.

Saya mencoba men-simulasikan pencitraan garis pada komputer menggunakan algoritma DDA di aplikasi Visual C#. Alih-alih menggambar piksel, saya menggambar susunan kotak-kotak yang membentuk garis pada aplikasi saya. Berikut algoritma DDA yang sudah diterjemahkan ke bahasa C#.

Saya menggunakan dua form, form pertama untuk menampilkan citra garis dan form kedua untuk menampilkan proses komputasinya pada sebuah textbox.

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Garis
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            this.Paint += new PaintEventHandler(drawKotak);
        }
        private FormTampilNilai FTN = new FormTampilNilai();
        private void drawKotak(object sender, PaintEventArgs e)
        {
            int Xawal = 1;
            int Yawal = 1;
            int Xakhir = 5;
            int Yakhir = 10;
            int Dx = Xakhir-Xawal;
            int Dy = Yakhir-Yawal;
            float r;
            int k;
            String tulisNilai;
            float xI, yI, x = Xawal, y = Yawal;
            if (Math.Abs(Dx) > Math.Abs(Dy))
            {
                r = Math.Abs(Dx);
            }
            else
            {
                r = Math.Abs(Dy);
            }
            xI = Dx/r;
            yI = Dy/r;
            Graphics g = e.Graphics;
            g.DrawRectangle(new Pen(Color.Black, 1), (Convert.ToInt32(Math.Round(x)) * 5), (Convert.ToInt32(Math.Round(y)) * 5), 5, 5); //Menggunakan rectangle dengan pewarnaan outline supaya lebih jelas terlihat
            FTN.Show();
            tulisNilai = "x: " + Convert.ToString(x) + ", y: " + Convert.ToString(y) + "   |   ";
            FTN.SetTextBoxNilai(tulisNilai);
            for (k=0; k<r; k++)
            {
                x += xI;
                y += yI;
                tulisNilai = "x: " + Convert.ToString(x) + ", y: " + Convert.ToString(y) + "   |   ";
                g.DrawRectangle(new Pen(Color.Black, 1), (Convert.ToInt32(Math.Round(x)) * 5), (Convert.ToInt32(Math.Round(y)) * 5), 5, 5);
                FTN.SetTextBoxNilai(tulisNilai);
            }
        }
    }
}

Form TampilNilai.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Garis
{
    public partial class FormTampilNilai : Form
    {
        public FormTampilNilai()
        {
            InitializeComponent();
        }

        public void SetTextBoxNilai(string Nilai)
        {
            textBoxNilai.Text = textBoxNilai.Text + Nilai;
        }
    }
}

Berikut screenshot dari aplikasi pencitraan garis menggunakan algoritma DDA yang saya buat, pada kasus ini saya menggunakan nilai X0 (Xawal) = 1, Y0 (Yawal) = 1, X1 (Xakhir) = 15, Y1 (Yakhir) = 40:

Pencitraan Garis Menggunakan Algoritma DDA pada Visual C#

Pencitraan Garis Menggunakan Algoritma DDA pada Visual C#

Pencitraan Garis Menggunakan Algoritma DDA pada Visual C#

Pencitraan Garis Menggunakan Algoritma DDA pada Visual C#

Pencitraan Garis Menggunakan Algoritma DDA pada Visual C#

Pencitraan Garis Menggunakan Algoritma DDA pada Visual C#

We need your comment here. Please leave it below.

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: