Tanggal 27 februari merupakan hari dimana praktikum grafika season 2 dimulai dengan asdos tetep maz rizahilmi.. dengan judul materi  TITIK DAN GARIS ... dlam praktikum ini kita dituntut untuk memahami algoritma pembentukan garis dengan Bressenham dan DDA. Dan kemudian mengaplikasikan algoritma tersebut ke dalam program. 
Teori yang di bahas di dalam praktikum meliputi :
1.                                 y     = mx      + b
                   
         
  PERSAMAAN GARIS
  | y = mx + b | 
Persamaan garis menurut koordinat Cartesian adalah
dimana m adalah slope/kemiringan garis yang dibentuk dari dua titik, yaitu (x1,y1) dan (x2,y2).Untuk penambahan x sepanjang garis yaitu dx akan mendapatkan penambahan y sebesar :       dy = m . dx
2.    ATRIBUT
  Atribut dasar untuk garis lurus adalah type (tipe), width (tebal) dan color (warna). 
3.    TIPE GARIS 
  Garis mempunyai beberapa linetype (tipe garis) diantaranya solid line (garis tebal), dashed line (garis putus), dan dotted line (garis titik-titik). 
4.    ALGORITMA PEMBENTUKAN GARIS
      Algoritma pembentukan garis menggunakan 3 algoritma :
- ALGORITMA GARIS DDA
Digital Diferensial Analyser (DDA) adalah algoritma pembentukan garis berdasarkan perhitungan dx maupun dy, menggunakan rumus dy = m . dx. Garis dibuat menggunakan dua endpoint, yaitu titik awal dan titik akhir. Setiap koordinat titik yang membentuk garis diperoleh dari perhitungan, kemudian dikonversikan menjadi nilai integer.
Langkah-langkah membentuk garis menurut algoritma DDA adalah :
a.    Tentukan dua titik yang akan dihubungkan dalam pembentukan garis
b.    Tentukan titik awal yaitu  dan titik akhir
 dan titik akhir   .
.
c.    Hitung dx =  x1- x0 dan dy = y1 – y0
d.    Tentukan step = max( |dx| , |dy| )
e.    Hitung penambahan koordinat pixel XInc = dx / step  dan YInc = dy / step
f.     Koordinat selanjutnya (x+XInc, y+yInc)
g.    Posisi pada layar ditentukan dengan pembulatan nilai koordinat tersebut
- Ulangi      nomor 6 dan 7 untuk menentukan posisi pixel berikutnya. sampai x=x1      dan y=y1.
Contoh Program Pembentukan Garis DDA
Diketahui dua titik untuk membentuk garis yaitu titik A(10,10) dan B(17,16).
·         Buat table perhitungan untuk titik-titik yang dihasilkan oleh algoritma DDA.
·         Buat program untuk mengimplementasikannya !
         
Jawab :
·         Tabel perhitungan
  Urutan langkah-langkah agoritma DDA :
a.    A(10,10) dan B(17,16)
b.     =(10,10) dan
=(10,10) dan  =(17,16)
=(17,16)
c.     à
à   à
à 
d.     à
à   à
à 
e.    ( )>(
)>( ) maka step = 7
) maka step = 7
f.     XInc = dx / step à XInc = 7 / 7 à XInc = 1
g.    YInc = dy / step  à YInc = 6 / 7 à YInc = 0,86
h.    (x+XInc, y+yInc) = (10+1, 10+0,86)= (11, 10,86)
i.      Dibulatkan à(11,11)
Ulangi langkah 5 dan 6 sampai 7 kali langkah.  Akan didapat table :
| k | x | Y | 
 | 
| 0 1 2 3 4 5 6 | 10 11 12 13 14 15 16 17 | 10 10,86 11,71 12,57 13,43 14,29 15,14 16 | (10,10) (11,11) (12,12) (13,13) (14,13) (15,14) (16,15) (17,16) | 
·         Program
Untuk proses pengkodean pembentukan garis DDA diperlukan fungsi utama yaitu  dan beberapa fungsi lain untuk inisialisasi dan tampilan.  
script dari fungsi pembentukan garis DDA:
Program Unit1.cpp
//---------------------------------------------------------------------------
#include 
#pragma hdrstop
#include 
#include 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int X1,X2,Y1,Y2;
int tergambar;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
  void __fastcall TForm1::FormActivate(TObject *Sender)
{
   Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DDA(int xa,int ya,int xb,int yb)
{
  int dx,dy,step,k;
  float Xincrement,Yincrement,x,y;
  xa=20; ya=10; xb=100; yb=100;
  dx= xb-xa;
  dy= yb-ya;
  x= (float)xa;
  y= (float)ya;
  if (abs(dx)>abs(dy))
  { step= (abs(dy)); }
  else
    { step= (abs(dx)); }
    Xincrement=(float)dx/step;
    Yincrement=(float)dx/step;
    Image1->Canvas->Pixels[int (x)][int (y)]=clBlack;
    judul(x,y);
    for (k=0;k<=step;k++)
    {
    x+=Xincrement;
    y+=Yincrement;
    Image1->Canvas->Pixels[int(x)][int (y)]=clBlack;
        tampil(x,y,k);
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
tergambar=true; X1=X; Y1=Y;        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
{
BtBaruClick(Sender);
tergambar=false;    //semua yang ditampilkan dihilangkan
X2=X; Y2=Y;
if (RadioGroup1->ItemIndex==0)
{DDA(X1,Y1,X2,Y2);
}
};
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtBaruClick(TObject *Sender)
{
 tergambar=false;
    Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
    }         //perhitungan mulai dari awal
    void __fastcall TForm1::judul(float x,float y)
{
char tampilX[20],tampilY[20];
 int xt=200, yt=15, kt=2;
 _gcvt(x,4,tampilX);
 _gcvt(y,4,tampilY);
   Image1->Canvas->TextOut(xt-50, (kt-1)*yt, "k") ;
   Image1->Canvas->TextOut(xt, (kt-1)*yt, "x") ;
   Image1->Canvas->TextOut(xt+50, (kt-1)*yt, "y") ;
   Image1->Canvas->TextOut(xt, kt*yt, tampilX) ;
   Image1->Canvas->TextOut(xt+50, kt*yt, tampilY) ;
   Image1->Canvas->TextOut(xt+100, (kt-1)*yt, "(x bulat, y bulat)") ;
   _gcvt(x,2,tampilX);
   _gcvt(y,2,tampilY);  
  //Menampilkan koordinat X dan Y
   Image1->Canvas->TextOut(xt+100, kt*yt,"(");
   Image1->Canvas->TextOut(xt+120, kt*yt,tampilX);
   Image1->Canvas->TextOut(xt+150, kt*yt,",");
   Image1->Canvas->TextOut(xt+160, kt*yt,tampilY);
   Image1->Canvas->TextOut(xt+190, kt*yt,")");  
}
//===================================================================   
 void __fastcall TForm1::tampil(float x,float y,int k)
{  
   char tampilX[20],tampilY[20],tampilK[20];
   int xt=200, yt=15;
   k += 3;
   //Menampilkan bilangan asli tanpa pembulatan
   _gcvt(x,4,tampilX);
   _gcvt(y,4,tampilY);
   Image1->Canvas->TextOut(xt, k*yt,tampilX);
   Image1->Canvas->TextOut(xt+50, k*yt,tampilY);
   //Menampilkan bilangan yang digunakan untuk pembulatan
   _gcvt(x,2,tampilX);
   _gcvt(y,2,tampilY);
   _gcvt(k-3,10,tampilK);
   //Menampilkan koordinat X dan Y
   Image1->Canvas->TextOut(xt-50, k*yt,tampilK);
   Image1->Canvas->TextOut(xt+100, k*yt,"(");
   Image1->Canvas->TextOut(xt+120, k*yt,tampilX);
   Image1->Canvas->TextOut(xt+150, k*yt,",");
   Image1->Canvas->TextOut(xt+160, k*yt,tampilY);
   Image1->Canvas->TextOut(xt+190, k*yt,")");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
Program Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include 
#include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TImage *Image1;
        TRadioGroup *RadioGroup1;
        TButton *BtBaru;
        TButton *Button2;
        void __fastcall FormActivate(TObject *Sender);
        void __fastcall DDA(int xa,int ya,int xb,int yb);
         void __fastcall judul(float x,float y) ;
         void __fastcall tampil(float x,float y,int k);
           void __fastcall Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y);
        void __fastcall Image1MouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
        void __fastcall BtBaruClick(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
private:            // User declarations
public:             // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


 
