Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Кафедра автоматизованих систем управління
Лабораторна робота №7
з дисципліни
«Комп’ютерна графіка»
на тему:
“Алгоритм Брезенхема для генерації кола”
Мета: Освоїти алгоритм побудови кола засобами комп’ютерної графіки.
ТЕОРЕТИЧНІ ОСНОВИ
У растр розкладають не тільки лінійні, але й інші, більш складні функції. Розкладанню конічних перетинів, тобто кіл, еліпсів, парабол, гіпербол було присвячено значне число робіт. Один з найбільш ефективних і простих для розуміння алгоритмів генерації кола належить Брезенхему. Для початку відзначимо, що необхідно згенерувати тільки одну восьму частину кола. Інші його частини можуть бути отримані послідовними відображеннями.
Для виведення алгоритму розглянемо першу чверть кола з центром у початку координат. Помітимо, що якщо робота алгоритму починається в точці x=0, y=R, то при генерації кола за годинниковою стрілкою в першому квадранті у є монотонно спадною функцією аргумента х. Аналогічно, якщо вихідною точкою є у=0, х=R, то при генерації кола проти годинникової стрілки х буде монотонно спадною функцією аргументу у. У нашому випадку вибирається генерація за годинниковою стрілкою з початком у точці х=0, у=R. Передбачається, що центр кола і початкова точка знаходяться точно в точках растра. Для будь-якої заданої точки на колі при генерації за годинниковою стрілкою існує тільки три можливості вибрати наступний піксел, що якнайкраще наближає коло: горизонтально вправо, по діагоналі вниз і вправо, вертикально вниз (mH, mD, mV відповідно). Алгоритм вибирає пікселі, для якого мінімальний квадрат відстані між одним з цих положень і колом, тобто мінімум з:
Покроковий алгоритм Брезенхема для генерації 1/8 кола:
Усі змінні – цілі, R – радіус кола.
xi=0
yi=R
1: while yi>=0 do
Di=(xi+1)2+(yi – 1)2 – R2
Plot(xi, yi)
If Di<0 then 2
If Di>0 then 3
If Di=0 then 4
визначення випадку 1 чи 2
2: d=|(xi+1)2+yi2 – R2| – |(xi+1)2+(yi – 1)2 – R2|
If d<=0 then xi=xi+1
Else
begin
xi=xi+1
yi=yi – 1
end
goto1
3: d’=| (xi+1)2+(yi – 1)2 – R2| – | (xi)2+(yi – 1)2 – R2|
If d’<=0 then
Begin
xi=xi+1
yi=yi – 1
end
Else xi=xi+1
goto1
4: xi=xi+1
yi=yi – 1
goto1
end{while}
finish
ПОРЯДОК РОБОТИ
Ознайомитись з алгоритмом Брезенхема для генерації.
Розробити графічний інтерфейс у вигляді пікселів, які будуть підсвічуватися при генерації кола.
Здійсніть генерацію кола за алгоритмом Брезенхема, у якому би підсвічувалися пікселі, або ж клітинки сітки.
Проаналізуйте результати.
Текст програми
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Menus, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Bevel1: TBevel;
PaintBox1: TPaintBox;
BitBtn1: TBitBtn;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label1: TLabel;
Label2: TLabel;
Label14: TLabel;
ex1: TEdit;
ey1: TEdit;
er: TEdit;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
procedure Chusto;
procedure Sitka;
procedure Tochka(x,y: integer; c: byte);
function Sign(k: integer): integer;
procedure Kolo(x1,y1,R: integer);
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
private
public
end;
const CP=15;//ціна поділки
var
Form1: TForm1;
x0,y0,w,h,x1,y1,R: integer;
new,draw: Boolean;
implementation
{$R *.DFM}
procedure TForm1.Chusto;
begin
new:=true; PaintBox1.Repaint;
end;
procedure TForm1.Sitka;
var j: integer;
begin
with PaintBox1.Canvas do
begin
Pen.Color:=clGray;
for j:=0 to 2*CP do
begin
MoveTo(0+j*CP,h); LineTo(0+j*CP,0);
MoveTo(0,h-j*CP); LineTo(w,h-j*CP);
end;
end;
end;
procedure TForm1.Tochka(x,y: integer; c: byte);
begin
with PaintBox1.Canvas do
begin
Brush.Color:=clGreen;
Rectangle(x0+x*CP,y0-(y+1)*CP,x0+(x+1)*CP,y0-y*CP);
if c=0 then
FloodFill(x0+x*CP+1,y0-(y+1)*CP+2,clGreen,fsBorder)
else begin
Brush.color:=clGray;
FloodFill(x0+x*CP+1,y0-(y+1)*CP+2,clGray,fsBorder); end
end;
end;
function TForm1.Sign(k: integer): integer;
begin
if k<0 then begin Sign:=-1; exit; end;
if k=0 then begin Sign:=0; exit; end;
if k>0 then begin Sign:=1; exit; end;
end;
procedure TForm1.Kolo(x1,y1,R: integer);
var x,y,mh,md,mv: integer;
begin
x:=x1; y:=y1;
Tochka(x,y,1);
Tochka(x+R,y,0);
Tochka(x-R,y,0);
x:=R; y:=0;
while x<>0 do
begin
mh:=abs(sqr(x-1)+sqr(y)-sqr(R));
md:=abs(sqr(x-1)+sqr(y+1)-sqr(R));
mv:=abs(sqr(x)+sqr(y+1)-sqr(R));
if (mh<mv)and(mh<=md) then //mh
begin
Tochka(x-1+x1,y+y1,0); Tochka(-x+1+x1,y+y1,0);
Tochka(x-1+x1,-y+y1,0); Tochka(-x+1+x1,-y+y1,0);
x:=x-1;
end;
if (md<mh)and(md<mv) then //md
begin
Tochka(x-1+x1,y+1+y1,0);
Tochka(x-1+x1,-y-1+y1,0);
Tochka(-x+1+x1,y+1+y1,0);
Tochka(-x+1+x1,-y-1+y1,0);
x:=x-1; y:=y+1;
end;
if (mv<mh)and(mv<=md) then //mv
begin
Tochka(x+x1,y+1+y1,0); Tochka(x+x1,-y-1+y1,0);
Tochka(-x+x1,y+1+y1,0); Tochka(-x+x1,-y-1+y1,0);
y:=y+1;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
w:=PaintBox1.Width; x0:=0*CP;
h:=PaintBox1.Height; y0:=h-0*CP;
draw:=false;
Chusto;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if (ex1.Text='')or(er.Text='')or(ey1.Text='') then
begin Chusto; exit; end;
x1:=StrToInt(ex1.Text); y1:=StrToInt(ey1.Text); R:=StrToInt(er.Text);
draw:=true; new:=true; PaintBox1.Repaint;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
if new=true then begin new:=false; Sitka; end;
if draw=true then begin draw:=false; Kolo(x1,y1,R); end;
end;
end.
Результат виконання програми
Висновок: в даній лабораторній роботі я ознайомився з основами комп’ютерної графіки – алгоритмом побудови кола методом Брезенхема.