TITIK DAN GARIS
1.PERSAMAAN GARIS :
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). Dalam beberapa paket aplikasi grafik, garis ditampilkan dengan menggunakan pilihan pen atau brush . Berikut ini dibicarakan bagaimanafungsi garis dapat mengakomodasi bermacam-macam spesifikasi atribut.
3.TIPE GARIS :
Garis mempunyai beberapa linetype (tipe garis) diantaranya solid line (garis tebal), dashed line (garis putus), dan dotted line (garis titik-titik). Algoritma pembentukan garis dilengkapi dengan pengaturan panjang dan jarak yang menampilkan bagian solid sepanjang garis.
Garis putus dibuat dengan memberikan nilai jarak dengan bagian solid yang sama.
Garis titik–titik dapat ditampilkan dengan memberikan jarak yang lebih besar dari bagain solid.
Prosedur yang serupa digunakan pula untuk membuat bermacam-macam tipe garis. Untuk mengatur atribut dalam program aplikasi PHIGS menggunakan fungsi: setLinetype (lt)
Langkah-langkah Program Algoritma Garis DDA :
1. Tentukan dua titik yang akan dihubungkan dalam pembentukan garis.
2. Tentukan salah satu titik sebagai awal(x0,y0) dan titik akhir(x1,y1).
3. Hitung dx=x1x0, dan dy= y1y0.
4. Tentukan langkah, yaitu dengan cara jarak maksimum jumlah penambahan nilai x maupun nilai y, dengan cara:
Bila nilai absolut dari dx lebih besar dari absolut dy, maka langkah= absolut dari dx. Bila tidak maka langkah= absolut dari dy
5. Hitung penambahan koordinat pixel yaitu x_increment=dx/langkah, dan y_increment=dy/langkah
6. Koordinat selanjutnya (x+x_increment, y+y_increment)
7. Posisi pixel pada layar ditentukan dengan pembulatan nilai koordinat tersebut.
8. Ulangi nomor 6 dan 7 untuk menentukan posisi pixel selanjutnya, sampai x = x1 dan y = y1.
Tampilan Algoritma garis DDA :
untitled1
Stript Program Algoritma Garis DDA
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=10;ya=10;xb=17;yb=16;
dx = xb-xa;
dy = yb-ya;
x=(float)xa;
y=(float)ya;
if (abs(dx)>abs(dy))
{ step = (abs(dx));}
else
{ step = (abs(dx));};
Xincrement=(float)dx/step;
Yincrement=(float)dy/step;
Image1->Canvas->Pixels[int (x)] [int (y)] = clBlack;
judul(x,y);
for (k=0;kCanvas->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)
{
Button1Click(Sender);
tergambar=false;
X2=X; Y2=Y;
if (RadioGroup1->ItemIndex==0)
{DDA(X1, Y1, X2, Y2);
}
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
tergambar=false;
Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
}
void _fastcall TForm1::judul(float x,float y)
{
char tampilX[20],tampilY[20];
int xt=200, yt=15, kt=2;
//menampilkan bilangan asli tanpa pembulatan
_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)”);
//Menampilkan bilangan yang digunakan untuk pembulatan
_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 pembualtan
_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();
}
2.Algoritma garis Bressenham
Tidak seperti Algoritma DDA, Algoritma Bressenham tidak membulatkan nilai posisi pixel setiap waktu. Algoritma Bressenham hanya menggunakan penambahan nilai integer yang juga dapat diadaptasi untuk menggambar lingkaran. Berikut ini langkah langkah untuk membentuk garis menurut algoritma Bressenham:
1. Tentukan dua titik yang akan dihubungkan
2. Tentukan salah satu titik di sebelah kiri sebagai titik awal yaitu(x0,y0) dan titik lainnya sebagai titik akhir(x1,y1).
3. Hitung dx,dy,2dx dan 2dy2dx.
4. Hitung parameter p0=2dydx
5. Untuk setiap xk sepanjang jalur garis, dimulai dengan k=0,
Tampilan Algoritma garis Bressenham
breseenham
Stript Program Algoritma garis Bressenham
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=10;ya=10;xb=17;yb=16;
dx = xb-xa;
dy = yb-ya;
x=(float)xa;
y=(float)ya;
if (abs(dx)>abs(dy))
{ step = (abs(dx));}
else
{ step = (abs(dy)); };
Xincrement=(float)dx/step;
Yincrement=(float)dy/step;
Image1->Canvas->Pixels[int (x)][int (y)]=clBlack;
judul(x,y);
for (k=0;kCanvas->Pixels[int(x)][int(y)]=clBlack;
tampil(x,y,k);
}
}
//————————————————————–
void __fastcall TForm1::Bressenham(int x1,int y1, int x2, int y2)
{
int dx=abs(x2-x1),dy=abs(y2-y1);
int p=2*dy-dx;
int twoDy=2*dy,twoDyDx=2*(dy-dx);
float x,y;
int step;
if(x1>x2){
x=x2;
y=y2;
step=x1;
}
else{
x=x1;
y=y1;
step=x2;
}
Image1->Canvas->Pixels[int (x)][int (y)]=clBlack;
//judul(x,y);
while (x<step){
x++;
if(pCanvas->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)
{{
Button1Click(Sender);
tergambar=false;
X2=X; Y2=Y;
if (RadioGroup1->ItemIndex==0)
{DDA(X1,Y1,X2,Y2);
}
else if(RadioGroup1->ItemIndex ==1)
{
Bressenham(X1,Y1,X2,Y2);
}
else
{
Image1->Canvas->MoveTo(X1,Y1);
Image1->Canvas->LineTo(X2,Y2);
}
};
}
//————————————————————–
void __fastcall TForm1::Button1Click(TObject *Sender)
{
tergambar=false;
Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
}
void __fastcall TForm1::judul(float x,float y)
{
char tampilX[20],tampilY[20];
int xt=200, yt=15, kt=2;
//Menampilkan bilangan asli tanpa pembulatan
_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)”);
//Menampilkan bilangan yang digunakan untuk pembulatan
_gcvt(x,2,tampilX);
_gcvt(y,2,tampilY);
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();
}