LINGKARAN DAN ELLIPSE
Tujuan PraktikumMemahami algoritma pembentukan lingkaran dan ellipse.
Mengaplikasikan algoritma tersebut ke dalam program
Dasar teori
Lingkaran
Untuk membentuk suatu lingkaran, ada beberapa algoritma yang bisa digunakan :
Algoritma Lingkaran 8 titik simetris
Proses
pembentukan lingkaran dengan algoritma ini dapat dilakukan dengan
menentukan suatu titik awal. Bila titik awal pada lingkaran (x,y) maka
terdapat tiga posisi lain, sehingga dapat diperoleh delapan titik.
Dengan demikian sebenarnya hanya diperlukan untuk menghitung segmen 45
derajat.
Void titikSimetris(int x, int y, int value)
{ SetPixel(x,y,value);
SetPixel(-x,y,value);
SetPixel(x,-y,value);
SetPixel(-x,-y,value);
SetPixel(y,x,value);
SetPixel(-y,x,value);
SetPixel(y,-x,value);
SetPixel(-y,-x,value);}Algoritma Lingkaran titik tengah (Mid Point )
Algoritma
mid point juga disebut algoritma lingkaran Bresenham. Bressenham
mengembangkan generator lingkaran yang cukup efisien. Algoritma yang
digunakan membentuk semua titik berdsarkan titik pusat dengan penambahan
semua jalur disekeliling lingkaran. Algoritma ini diturunkan dari
algoritma mid point untuk pem,bentukan garis.
Program
Untuk proses
pengkodean pembentukan lingkaran mid point diperlukan fungsi utama
yaitu dan beberapa fungsi lain untuk inisialisasi dan tampilan. Adapun
script dari fungsi – fungsi tersebut adalah :
//---------------------------------------------------------------------------
#include
#include
#include
#pragma hdrstop
#include "AlgoCircle.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int tergambar, XC,YC,QX,QY;
//---------------------------------------------------------------------------
__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::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
tergambar=true;
XC=X;
YC=Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CirclePlotPoint(int XC, int YC, int X,int Y)
{
Image1->Canvas->Pixels[XC+X][YC+Y]=clBlack;
Image1->Canvas->Pixels[XC-X][YC+Y]=clBlue;
Image1->Canvas->Pixels[XC+X][YC-Y]=clGreen;
Image1->Canvas->Pixels[XC-X][YC-Y]=clYellow;
Image1->Canvas->Pixels[XC+Y][YC+X]=clRed;
Image1->Canvas->Pixels[XC-Y][YC+X]=clPurple;
Image1->Canvas->Pixels[XC+Y][YC-X]=clRed;
Image1->Canvas->Pixels[XC-Y][YC-X]=clYellow;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
int R;
BtBaruClick(Sender);
tergambar=false;
QX=X;
QY=Y;
R=int(sqrt(pow(XC-QX,2)+pow(YC-QY,2)));
if (RadioGroup1->ItemIndex==0)
{ CircleMidPoint(XC,YC,R);
};
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CircleMidPoint(int XC, int YC,int R)
{
int x,y,p,k=0;
R=10;
x=0; y=R; p=1-R;
judul((float)x,(float)y,k,p);
do
{
k++;
if
(p<0) x="x+1;" x="x+1;" y="y-1;" p="p+2*x+1;" p="p+2*(x-y)+1;"
k="k+2;" yt="15;" xt="200,"
i="0;i<20;i++)">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,")");
Image1->Canvas->TextOut(xt,k*yt,tampilPk);
}
//--------------------------------------------------------------------------
void __fastcall TForm1::judul(float x,float y,int k,int p)
{
int xt=200, yt=15, kt=2;
Image1->Canvas->TextOut(xt-50,(kt-1)*yt,"k");
Image1->Canvas->TextOut(xt,(kt-1)*yt,"pk");
Image1->Canvas->TextOut(xt+100,(kt-1)*yt,"(x k+1, y k+1)");
}
void __fastcall TForm1::BtBaruClick(TObject *Sender)
{
tergambar=false;
Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtCloseClick(TObject *Sender)
{
Close();
}
//----------------------------------------------
hasil Output :-----------------------------
TITIK DAN GARIS
Dasar Teori
PERSAMAAN GARIS
Persamaan
garis menurut koordinta Cartesian adalah y=mx + b dimana m adalah slope
/ kemiringan garis yang di bentuk dari dua titik, yaitu (x1,y1)n dan
(X2,Y2). Untuk penambahan x sepanjang garis yaitu dx akan mendapatkan
penambahan y sebesar : dy =m.dx
ATRIBUT
Atribut dasar untuk garis lurus adalah type (tipe), width (tebal) dan color (warna). Dalam
beberapa paket apliksi grafik, garis ditampilkan dengan menngunakan
pilihan pen atau brush. Berikut ini dibicarakan bagaimana fungsi garis
dapat mengkomodasi bermacam – macem spesifikasi atribut.
TIPE GARIS
Garis mempunyai beberapa linetype (tipe garis) diantaranya solid line ( garis tebal ), dashed line (garis putus), dan dotted line ( garis titik – titik).
Program di bawah ini menggambarkan penggunaan perintah linetype
#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;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)
{
{
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 pe
mbulatan
_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();
}
//---------------------------------------------------------------------------
dengan hasil output :