- •Київ кнутд 2007
- •1.2 Сфери використання
- •1.3 Головнi поняття I операцiї
- •1.4 Типи графiчних приладiв
- •2 Алгоритми растрової графiки
- •2.1 Растрова I векторна графiка
- •2.1.1 Цифровий диференцiйний аналiзатор
- •2.1.2 Алгоритм Брезенхема побудови вiдрiзкiв
- •2.1.3 Алгоритм Брезенхема креслення кола
- •2.1.4 Алгоритм Брезенхема побудови елiпса
- •2.2 Растрова розгортка багатокутникiв.
- •2.2.1 Алгоритм заповнення з упорядкованими списками ребер
- •2.2.2 Алгоритм заповнення за ребрами
- •2.2.3 Алгоритм заповнення iз списком ребер I прапорцем
- •2.2.4 Простий алгоритм заповнення iз зачiпкою
- •2.2.5 Алгоритм заповнення по рядкам iз зачiпкою
- •2.3 Ефект драбини
- •3. Лабораторнi роботи
- •3.1 Лабораторна робота BresLine на тему "Виведення вiдрiзкiв прямих за алгоритмом Брезенхема"
- •3.2 Лабораторна робота BresCirc на тему "Виведення дуг кола за алгоритмом Брезенхема".
- •3.3 Лабораторна робота BresEllips на тему "Виведення елiпсiв за алгоритмом Брезенхема".
- •3.4 Лабораторна робота FloodLine на тему "Заповнення полiгональних фiгур".
- •3.5 Лабораторна робота FloodCirc на тему "Заповнення довiльних областей".
- •4. Література
- •1 Вступ 5
- •2 Алгоритми растрової графiки 8
- •4. Література 54
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)2 – R 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)2 – R 2 = (xi + 1)2 + y2i+1 - 2yi+1 + 1 -R2=
= (xi + 1)2 + (yi - 1)2 – R 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]