LINGKARAN BRESENHAM
Algoritma lingkaran bresenham memerlukan
menggambar pada octant yang pertama saja sedangkan titik-titik pada
kuadran lain dapat diperoleh pada pencerminan titik-titik pada oktan
pertama.
Pembuatan
suatu lingkaran merupakan salah satu primitive yang berperan dalam
grafika komputer. Prinsip yang dipakai pada penelitian ini dalam
pembuatan lingkaran adalah menterjemahkan dari bahasa matematika ke
dalam bahasa pemrograman untuk metode Bezier dan algoritma Bresenham.
Untuk program-program terapan sederhana, lingkaran yang diperoleh dari
bentuk dasar kurva cukup memadai, tetapi seringkali diinginginkan bentuk
lingkaran yang jauh lebih rumit dan tidak teratur. Bentuk fungsi
matematis yang paling utama untuk menggambar kurva sebagai dasar
pembuatan bentuk lingkaran adalah fungsi parametrik atau vector-valued
function yaitu untuk sembarang titik pada suatu permukaan, lokasinya
ditentukan oleh dua buah parameter u dan v biasanya bernilai antara 0
dan 1, dan fungsi parametrik x,y, dan z merupakan lokasi-lokasi titik
pada kurva atau permukaan. Algoritma de Casteljau [2] merupakan
algoritma untuk membuat kurva menggunakan sejumlah titik kontrol, dan
menggunakan teknik in-betweening untuk mendapatkan kurva yang
diinginkan. Algoritma ini dikembangkan oleh P. de Casteljau, dan
merupakan cikal bakal kurva Bezier, yang secara terpisah dikembangkan
lebih lanjut oleh P. Bezier. Algoritma de Casteljau untuk membuat kurva
Bezier cukup ampuh secara algoritmik, tetapi tidak secara eksplisit
menyatakan bentuk fungsionalnya. Karena alasan ini, kemudian
dikembangkan persamaan lain untuk membuat kurva Bezier, yang sangat
berguna untuk tujuan analisis.
Algoritma
Bresenham dipilih karena merupakan metode dasar grafis yang sangat
populer dan terkenal efisiensinya, Bresenham memakai dasar integer arithmetic yang jauh lebih cepat daripada floating-point arithmetic yang
biasa dipakai dan menggunakan suatu persamaan matematis untuk
mengetahui adanya baris atau kolom baru yang akan dibuat dalam proses
pembuatan suatu garis. Tetapi Bresenham juga memiliki kekurangan yaitu
timbulnya error jika dua segmen garis yang overlap dibuat, error juga
akan timbul jika sebuah segmen garis yang intensitasnya berbeda overlap
terhadap suatu segment garis yang sudah ada.
Algoritma
Bresenham menggunakan aritmatika integer yang tidak memerlukan
perkalian dan pembagian dalam proses perhitungannya didalam seluruh
implementasi, yang mana aritmatika integer ini memiliki kecepatan
perhitungan yang lebih tinggi daripada aritmatika floating point.
Algoritma Bresenham memberikan persamaan umum untuk lingkaran sebagai
berikut:
(X – a)2 + (Y – b)2 = R2
Dengan
(Xa,Ya) sebagai koordinat awal dan (Zt,Yt) sebagai koordinator akhir.
Persamaan umum lingkaran yang diberikan oleh Algoritma Bresenham di atas
diturunkan dari persamaan umum lingkaran :
X2 + Y2 = R2
Keterangan:
X = absis ³ 0
Y = ordinat ³ 0
R = bilangan integer ³ 1.
Pada
algoritma pembuatan lingkaran dengan arah penggambaran searah jarum
arah jarum jam untuk lintasan yang besarnya seperempat lingkaran atau 90˚ memiliki tiga titik perhitungan yaitu m1, m2, dan m3.
Gambar 6. Flowchart Procedure
Bresenham
Fungsi procedure dibawah ini sebagai algoritma utama Bresenham untuk menggambar lingkaran.
begin
x:=0;
y:=100;
xCenter:=150;
yCenter:=150;
plotpoints;
p:=1-y;
while x <>
begin
if p<0>
x:=x+1
else
begin
x:=x+1;
y:=y-1;
end;
if p<0>
p:=p+2*x+1;
else
p:=p+2*(x-y)+1;
plotpoints
end;
end;
Menggambar sebuah lingkaran dengan menggunakan delphi7
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
CheckBox1: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
findrawing:boolean;
fjari,xcenter, ycenter:integer;
procedure GambarLingkaran(r:integer);
procedure GambarTitik(xi, yi:integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.GambarTitik(xi,yi:integer);
var
x,y:Integer;
begin
x:=xcenter+xi;
y:=ycenter-yi;
canvas.pixels[x,y]:=clBlack;
//Deklarasi untuk view all
if checkbox1.checked then
begin
x:=xcenter-xi;
y:=ycenter-yi;
canvas.pixels[x,y]:=clBlack;
x:=xcenter-xi;
y:=ycenter+yi;
canvas.pixels[x,y]:=clBlack;
x:=xcenter+xi;
y:=ycenter+yi;
canvas.pixels[x,y]:=clBlack;
end;
end;
procedure TForm1.GambarLingkaran(r:integer);
var
d1, d2:Real;
xi, yi:integer;
mh, md, mv:integer;
begin
xi:=0;
yi:=R;
while yi > 0 do
begin
GambarTitik(xi, yi);
md:=abs(sqr(xi+1)+sqr(yi-1)-sqr(r));
mh:=abs(sqr(xi+1)+sqr(yi)-sqr(r));
mv:=abs(sqr(xi)+sqr(yi-1)-sqr(r));
d1:=sqr(xi+1)+sqr(yi-1)-sqr(r);
if d1<0>
begin
d2:=mh-md;
if d2<=0 then
begin
xi:=xi+1;
yi:=yi;
end
else
begin
xi:=xi+1;
yi:=yi-1;
end;
end
else if d1>0 then
begin
d2:=mv-md;
if d2<=0 then
begin
xi:=xi;
yi:=yi-1;
end
else
begin
xi:=xi+1;
yi:=yi-1;
end;
end
else if d1=0 then
begin
xi:=xi+1;
yi:=yi-1;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TRY
Canvas.FillRect(Rect(0, Panel1.Height,Width,Height));
xcenter:=width div 2;
ycenter:=height div 2;
GambarLingkaran(strtoint(edit1.Text));
EXCEPT
ShowMessage('ISI!');
end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
xcenter:=x;
ycenter:=y;
findrawing:=true;
CheckBox1.Checked:=true;
//tentukan jari2 pertama sama dengan 10
fjari:=10;
//gunakan modus pen pmnotxor
Canvas.Pen.Mode:=pmNotXor;
//gambar lingkaran pertama
GambarLingkaran(fjari);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
dx,dy:integer;
begin
if findrawing then
begin
//hapus lingkaran sebelumnya
GambarLingkaran(fjari);
//hitung jari2 yang baru
dx:=abs(xcenter-x);
dy:=abs(ycenter-y);
if dx>dy then fjari:=dx else fjari:=dy;
//gambar lingkaran yang baru
GambarLingkaran(fjari);
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
dx,dy:integer;
begin
//hapus lingkaran sebelumnya
GambarLingkaran(fjari);
//selesai menggambar
findrawing:=false;
//ubah modus ke pmcopy
Canvas.Pen.Mode:=pmCopy;
//hitung jari2 yang baru
dx:=abs(xcenter-x);
dy:=abs(ycenter-y);
if dx>dy then fjari:=dx else fjari:=dy;
//gambar lingkaran terakhir
GambarLingkaran(fjari);
end;
minta projectnya gan..
BalasHapusuntuk nempatin prosedure yang gambar titik sama gambarlingkaran itu disebelah mana ya?
BalasHapus