Curhat, tutorial, tugas kuliah, dll..

Untuk penjelasan tentang algoritma pembuatan garis lebih detail, silakan download slide grafcit dari ITT disini, atau klik aja di gambar yaaa Nah, sekarang marilah kita fokus membahas mengenai algoritma bresenham.. Kenapa algoritma DDA atau matematis tidak dibahas? yaaa itu mah mudah lah yaa? pasti temen2 udah pada langsung bisa implementasi :D (sebenernya saya mls ngebhasnya aja sih, eh apa sebenrnya saya malah engga bisa yaa? hehe)

Konsep Bresenham

Algoritma bresenham yang ditulis pada slide grafcit ITT hanya dapat menangani satu dari 4 kasus garis yang ada. Untuk lebih jelasnya silakan pahami kasus-kasus pada pembentukkan garis yang ada di gambar bawah ini. case bresenhamBresenham yang ada pada slide hanya mampu menangani kondisi pojok kiri atas pada gambar. Untuk dapat membuat bresenham tersebut dapat menangani semua kasus kita perlu menambahkan lagi kondisi untuk setiap kasus, dan setiap kasus tersebut perlu memodifikasi bresenham yang asli.

implementasi dengan processing

Disini saya membuat 4 case untuk menyelesaikan persoalan algoritma bersenham tersebut. saya hanya tinggal mengedit beberapa bagian dari algoritma dengan berfikir sederhana.. Untuk dapat melakukannya tentulah kita harus memahami dahulu algoritma bresenham.. berikut saya lampirkan source code processing untuk mengimplementasikan algoritma garis bresenham..

static int canvasW = 600;
static int canvasH = 600;
void setup() {
  size(canvasW, canvasH);
  background(255);
}

//--------------------------------- variable global ditulis disini

//--------------------------------- disini mulai codingnya
void draw() {
  drawHelpLines();
  bresenham(30,20,85,75);
}

void bresenham(int x1, int y1, int x2, int y2){
  stdPoint(x1,y1);
  stdPoint(x2,y2);
  int dy=abs(y2-y1);
  int dx=abs(x2-x1);
  if (x1<=x2 && y1<=y2){
    if (dx>=dy){
      int pk=2*dy-dx;
      for (int i=0;i<dx;i++) {
        if (pk<0) {
          stdPoint(x1++, y1);
          pk=pk+2*dy;
        } else {
          stdPoint(x1++, y1++);
          pk=pk+2*dy-2*dx;
        }
      }
    }else{
      int pk=2*dx-dy;
      for (int i=0;i<dy;i++) {
        if (pk<0) {
          stdPoint(x1, y1++);
          pk=pk+2*dx;
        } else {
          stdPoint(x1++, y1++);
          pk=pk+2*dx-2*dy;
        }
      }

    }
  }else {
    if (dx>=dy){
      int pk=2*dy-dx;
      for (int i=0;i<dx;i++) {
        if (pk<0) {
          stdPoint(x1--, y1);
          pk=pk+2*dy;
        } else {
          stdPoint(x1--, y1++);
          pk=pk+2*dy-2*dx;
        }
      }
    }else{
      int pk=2*dx-dy;
      for (int i=0;i<dy;i++) {
        if (pk<0) {
          stdPoint(x1, y1++);
          pk=pk+2*dx;
        } else {
          stdPoint(x1--, y1++);
          pk=pk+2*dx-2*dy;
        }
      }

    }

  }
}

//-------------------------------

// -------------------------------- normalisasi, ga perlu dirubah

void stdPoint(int xxx, int yyy)
{
  point(xxx+(canvasW/2), (yyy*-1)+(canvasH/2));
}

void drawHelpLines()
{
  stroke(0, 0, 255);
  for (int z=0; z<canvasW; z++){
    point((canvasW/2), z);
    point(z, (canvasH/2));
  }
  stroke(0, 0, 0);
}

Nah, untuk membandingkan algoritma garis yang sudah kamu buat apakah sudah oke atau belum? coba bandingkan dengan method pembuatan garis yang ada pada processing (http://processing.org/reference/line_.html)

line(30, 20, 85, 75);
About these ads

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: