Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
20071227_Chumak_MU.doc
Скачиваний:
3
Добавлен:
09.11.2019
Размер:
694.27 Кб
Скачать

2.1.3 Алгоритм Брезенхема креслення кола

У растр потрiбно розкладати не тiльки лiнiйнi, а й iншi, складнiші функцiї. Розкладання у растр конiчних перерiзiв, тобто кола, елiпса, параболи, гiперболи, розглядалося у значної кiлькостi робiт ([14], [15], [16], [17]). Найбiльшу увагу приділяли колу ([18], [19], [20], [21]).Найбiльш ефективний i нескладний алгоритм був запропонований Брезенхемом [22]. Для початку зауважимо, що можна генерувати тiльки одну восьму частину кола (наприклад, перший октант з кутом вiд 0 до 45 градусiв). Інші частини одержуємо послiдовними симетрiями (вiдносно прямої y=x , потім вiдносно прямої x=0 i нарештi вiдносно прямої y=0).Для побудови алгоритму розглянемо першу чверть (квадрант) кола з центром в початку координат. Зауважимо, що при початку роботи алгоритму з точки (0,R) i генерацiї точок кола за годинниковою стрiлкою у першому квадрантi y-координати згенерованих точок, є монотонно спадною функцією вiд аргументу x. Будемо вважати, що центр кола знаходиться у точцi (0,0) i радiус R>0 є величина цiла.

Для будь-якої точки кола при генеруваннi за напрямом стрiлки годинника iснує лише три можливостi обрати наступний пiксел, що наближатиме коло найлiпшим чином:

Рис.1. Вибiр пiкселiв у першому квадрантi

На рис.1. цi напрямки позначенi вiдповiдно mH, mD, і mV. Алгоритм вибирає той пiксел, для якого є найменшим квадрат вiдстанi мiж одним з цих пiкселiв i колом, тобто вибирає мiнiмум з наступних чисел

У околi точки (xi,yi) можливi лише п'ять типiв перетину кола з сіткою растра:

Випадок 1. Коло пройде мiж точками (xi+1,yi) i (xi+1,yi-1).

Випадок 2. Коло пройде мiж точками (xi+1,yi) i (xi+1,yi+1).

Випадок 3. Коло пройде мiж точками (xi,yi-1) i (xi+1,yi-1).

Випадок 4. Коло пройде мiж точками (xi-1,yi-1) i (xi, yi-1).

Випадок 5. Коло пройде через точку (xi+1,yi-1).

Позначимо через рiзницю мiж квадратами вiдстаней вiд центра кола до пiксела (xi+1,yi-1) i вiд центра кола до точки на колi, тобто .

Як у алгоритмi Брезенхема для вiдрiзка, бажано при обраннi нового пiксела використовувати лише знак похибки . Розглянемо алгоритм пiд цим кутом зору.

1. Випадок, коли <0. При <0 дiагональна точка (xi+1,yi-1) знаходиться всерединi кола, тобто маємо випадки 1 або 2. Звiсно, що потрiбно вибрати або пiксел (xi+1,yi), тобто mH, або пiксел (xi+1,yi-1), тобто mD.

Розглянемо спочатку випадок 1. Знайдемо рiзницю квадратiв вiдстаней від кола до пiкселiв у горизонтальному mH i дiагональному mD напрямках:

При <0 вiдстань вiд кола до дiагонального пiксела (величина mD) бiльшa нiж до горизонтального (величина mH). Тому

при 0 вибираємо mH (у точку (xi+1, yi)),

інакше вибираємо mD ( у точку (xi+1, yi-1))

(3)

Зауважимо, що у випадку 1: (xi+1)2 +yi2-R2 0, (xi+1)2 +(yi-1)2-R2 0 тому що дiагональний пiксел (xi+1,yi-1) завжди лежить всерединi кола, а горизонтальний пiксел (xi+1,yi) - зовнi. Тому можна рахувати за формулою

= (x i +1)2 + y i 2 R 2 + (x i +1) 2+(y i - 1)2-R 2

=2(x i +1) 2 + 2 yi 2-12-2 R 2-2 y i -1=2 ( + yi)-1

У випадку 2 потрiбно вибрати горизонтальний пiксел (xi+1,yi) тому, що y є монотонно спадна функцiя вiд x. При цьому горизонтальний (xi+1,yi) i дiагональний (xi+1,yi-1) пiкселi лежать у серединi кола.

Тодi (xi + 1) 2+ y i 2 R 2 <0, (x i + 1) 2 + (y i - 1) 2 R 2<0 i

= - (x i + 1) 2 y i 2 + R 2 + (x i + 1) 2 + (y i - 1) 2 - R 2= - 2yi +1<0.

Тому дiє правило (3).

2. Випадок, коли >0. При >0 дiагональна точка (xi+1,yi-1) знаходиться зовнi кола, тобто одержуємо випадки 3 i 4 (потрiбно вибрати або пiксел (xi+1,yi-1), тобто mD, або пiксел (xi,yi-1), тобто mV). Знайдемо рiзницю квадратiв вiдстаней вiд кола до пiкселiв у дiагональному mD i вертикальному mV напрямках:

При '<0 вiдстань вiд кола до вертикального пiксела (xi, yi-1) бiльше нiж вiдстань до дiагонального (xi+1, yi-1) пiксела. Тому формулюємо наступне правило вибору

при 0 вибираємо mD ( у точку (x i+ 1, yi - 1))

інакше вибираємо mV (у точку (xi, yi-1))

(4)

Перевiрка компонент ' для випадку 3 дає (xi + 1) 2 + ( yi - 1) 2 R 2 0,

x i 2 + (y i + 1) 2 R 2 < 0 тому, що у цьому випадку дiагональний пiксел

(x i + 1 , y i - 1) лежить зовнi кола, а вертикальний пiксел (x i , yi - 1) -- у серединi кола. Звідси

’= (x i +1)2 + (y i - 1) 2 R 2 + x i 2+(y i - 1)2-R 2

=2(x i +1) 2 + 2( yi - 1)2 - 2 R 2 + (y i -1)2 – 2 xi - 1=2 ( + xi)-1

У випадку 4 потрiбно вибирати вертикальний пiксел (xi, yi-1) тому, що y є монотонно спадна функція вiд x. При цьому (xi + 1)2(yi -1)2 - R2>0,

xi2 + (yi - 1)2 - R2>0 тому, що обидва пiкселя знаходяться зовнi кола. Звiдси '>0, тобто дiє правило (4)

3. Випадок, коли =0. При =0 маємо випадок 5, тобто коли дiагональний пiксел (xi+1,yi-1) належить до кола. Перевiрка компонент виразу дає (xi+1)2+yi2-R2>0, (xi+1)2+(yi-1)2-R2=0.

Тому =(xi+1)2+yi2-R2>0 i вибираємо дiагональний пiксел (xi+1)+(yi-1)2-R2, що збiгається з правилом (3). Перевірка компонент виразу ' дає (xi+1)2+(yi-1)2-R2=0, xi2+(yi-1)2-R2=0, xi2+(yi-1)2-R2 0.

Тому '=(xi+1)2+(yi-1)2-R2>0 i вибираємо дiагональний пiксел (xi+1,yi-1), що збiгається з правилом (4).

Таким чином, випадок, коли =0 можна обробляти як за випадком, коли <0, так i за випадком, коли >0.

Знайдемо рекурентнi спiввiдношення для реалiзацiї крокiв алгоритму. Розглянемо рiзнi випадки.

Горизонтальний крок mH до пiкселя (xi+1,yi): xi+1=xi+1, yi+1=yi,

i+1=(xi+1 + 1) 2 + (yi+1 - 1) 2- R 2=xi+1 2 + 2xi+1 + 1 + (yi-1) 2 R 2=

= (xi+1) 2 + (y i-1)2 R 2 + 2xi+1 + 1= i + 2xi+1 + 1.

Дiагональний крок mD до пiкселя (xi+1,yi-1):xi+1=xi+1, yi+1=yi-1,

i+1=(xi+1 + 1) 2 + (yi+1 - 1) 2 R 2 = xi+1 2 + 2xi+1 + 1 + yi+12 - 2yi+1 + 1 – R 2 =

= (xi + 1)2 + (yi - 1)2R 2 + 2xi+1 - 2yi+1 + 2 = i + 2xi+1 - 2yi+1 + 2.

Вертикальний крок mV до пiкселя (xi, yi-1): xi+1 = xi, yi+1 = yi-1,

i+1 = (xi+1 + 1)2 + (yi+1 - 1)2R 2 = (xi + 1)2 + y2i+1 - 2yi+1 + 1 -R2=

= (xi + 1)2 + (yi - 1)2R 2 - 2yi+1 + 1 = i - 2yi+1 + 1.

Тепер ми можемо розглянути алгоритм Брезенхема побудови частини кола у першому квадрантi.

Програма, що реалiзує алгоритм Брезенхема креслення частини кола у першому квадрантi.

{Метод Брезенхема побудови частини кола у першому квадрантi}

unit Unit1;

interface {Unit1}

uses Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

type TForm1 = class(TForm)

Label1,Label2,Label3:TLabel;Button1:TButton;

Edit1,Edit2,Edit3:TEdit;

procedure Button1Click(Sender: TObject);

private { Private declarations }

public { Public declarations }

end;

var Form1: TForm1;

implementation {Unit1}

{$R *.DFM}

var Xs,Ys,R : integer;

procedure RastrBresCircle(Xc,Yc,R,Color:integer);

var i,D,DL,DLP,Lim,x,y:integer;

{тут D=Dgreat,DL=DLitle,DLP=DLitlePrim}

begin {RastrBresCircle}

if R>0

then begin {R>0}

{початкове установлення змiнних}

x:=0;y:=R;

D:=2*(1-R);Lim:=0;

repeat {Початок головного циклу}

Form1.Canvas.Pixels[Xc+x,Yc+y]:=Color;

if y<=Lim then break;

if D<0

then begin {D<0}

DL:=2*D+2*y-1;

if DL<=0

then begin x:=x+1; D:=D+2*x+1; end

else begin x:=x+1;y:=y-1;D:=D+2*x-2*y+2; end;

end {D<0}

else begin {D>=0}

if D>0

then begin {D>0 }

DLP:=2*D-2*x-1;

if DLP<=0

then begin

x:=x+1;y:=y-1;

D:=D+2*x-2*y+2;

end

else begin

y:=y-1;

D:=D-2*y+1;

end;

end {D>0}

else begin {D=0}

x:=x+1;y:=y-1;D:=D-2*y+2;

end; {D=0}

end; {D>=0}

until false;

end; {R>0}

end;{RastrBresCircle}

procedure TForm1.Button1Click(Sender: TObject);

begin {TForm1.Button1Click}

Xs:=StrToInt(Edit1.Text);

Ys:=StrToInt(Edit2.Text);

R:=StrToInt(Edit3.Text);

RastrBresCircle(Xs,Ys,R,clGreen);

end; {TForm1.Button1Click}

end. {Unit1}

Лiтература. [22], [5]

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]