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

2 Алгоритми растрової графiки

2.1 Растрова I векторна графiка

Растр, або растровий масив (англ. bitmap - масив бiтiв), як це можна побачити з назви, - це сукупнiсть бiтiв, якi розташованi на полотнi. Такий біт позначає чарунку (комірку) пам’яті комп'ютера, що може знаходитись у включеному (за звичай позначається 1) або виключеному ( позначається 0) станi. Цi стани можна використовувати для представлення чорного i бiлого кольорiв. Сукупнiсть чорних i/або бiлих точок на цьому полотнi дозволяє створювати чорно-бiле растрове зображення. Растрове зображення можна розгдядати як аркуш паперу у клiтинку, де кожна клiтинка замальована чорним або бiлим кольором, формуючи в сукупностi малюнок. Iнше представлення - це пiксел.

Методи формування, перетворення i зберiгання растрових малюнкiв є предметом розгляду растрової графiки (англ. raster graphics або paint-type graphics). Існує досить багато програм для роботи з растровими зображеннями, наприклад Paint, Photoshop рiзних версій та ін.. Створено та використовується багато форматiв файлiв для зберiгання растрових зображень, наприклад *.bmp.

Растровi зображення можуть нести графічну iнформацiю будь-якої складності аж до кольорових фотографiй. Але вони потребують багато мiсця (розмiр файлу є пропорцiйним розмiру зображення) для зберiгання i їх не можна довільно збiльшувати без погіршення якості зображення (вони мають скiнченну бiтову глибину). Виникають труднощi також i при редагуваннi растрових файлiв. Тому з’явився iнший напрямок комп'ютерної графiки - векторна графiка. Векторна графiка передбачає представлення малюнку як сукупностi графiчних примiтивiв (що мiстять математичнi формули з параметрами опису базових графiчних об'єктiв) з послiдовнiстю комп'ютерних команд для роботи з цими графiчними примiтивами. Це дозволяє комп'ютеру i/або комп'ютерним приладам (наприклад, монiтору або принтеру), обчислювати, де треба розмiщувати точки зображення при відтворенні цих об'єктiв. При цьому розмiри векторних файлiв для зберiгання малюнкiв зменшуються у десятки разiв.

Оскільки будь-яка програма завжди може моделювати як растрову так i векторну графiку, виконуючи при цьому iнструкцiї мови програмування, то далi будемо моделювати растрову сiтку як двовимiрний масив. При цьому стан пiкселя буде вiдображатися значенням елементу цього масиву. Розмiри масиву будуть вiдповiдати розмiрам областi вiдображення.

Почнемо з малювання на полотнi растра вiдрiзкiв прямих i частин кола та елiпса.

2.1.1 Цифровий диференцiйний аналiзатор

Нехай на площинi задано двi рiзнi точки і ( ). З аналiтичної геометрiї вiдома формула рiвняння прямої , що проходить через точки i :

(1)

Якщо на прямiй вибрати послiдовнi (рiвновiддаленi) точки = , , починаючи з точки i закiнчуючи точкою , то пiсля пiдстановки в рiвняння прямої отримаємо спiввiдношення . Але , . Тому для знаходження точок маємо наступнi рекурентнi спiввiдношення

, , .

(2)

де - крок вздовж осі , - крок уздовж осi , - початкова а - кiнцева точки вiдрiзка .

Цiй метод має назву цифрового диференцiйного аналiзатора (ЦДА) за використанням його при розробцi перших дисплеїв.

Вiдповiдний модуль:

{Метод Цифрового диференцiйного аналiзатора побудови вiдрiзку}

unit Unit1; interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls;

Type

TForm1 = class(TForm)

Label1, Label2, Label3, Label4: TLabel;

Button1: TButton;

Edit1, Edit2, Edit3, Edit4: TEdit;

procedure Button1Click(Sender: TObject);

private { Private declarations }

public { Public declarations }

end;

var Form1: TForm1;

implementation {$R *.DFM}

var Xs,Ys,Xf,Yf // початкова i кiнцева точки вiдрiзка

: integer;

// цiла частина

function Integ(x:real):integer;

var y:real;

begin {Integ}

y:=Round(x)-2;

while (y<=x) do y:=y+1;

result:=Round(y-1);

end; {Integ}

// Функцiя SignR дозволяє використовувати алгоритм для всiх квадрантiв}

function SignR(X:real):real;

begin {SignR}

if X>0 then result:=1;

if X=0 then result:=0;

if X<0 then result:=-1;

end; {SignR}

procedure ZDA(Xs,Ys,Xf,Yf,Color:integer);

var i: integer; x,y,Dx,Dy,H: real;

begin {ZDA}

{знаходимо найбiльшу проекцiю вiдрiзка}

if Abs(Xf-Xs)>=Abs(Yf-Ys) then H:=Abs(Xf-Xs)

else H:=Abs(Yf-Ys);

{знаходимо прирости dx i dy на одиницю растра}

Dx:=(Xf-Xs)/H; Dy:=(Yf-Ys)/H;

{заокруглення, але не вiдкидання дробовоi частини}

x:=Xs+SignR(Dx)/2; y:=Ys+SignR(Dy)/2;

i:=1; {початок головного циклу}

while (i<=H) do

begin {while}

Form1.Canvas.Pixels[Integ(x),Integ(y)]:=Color;

x:=x+Dx; y:=y+Dy; i:=i+1;

end; {while}

end; {ZDA}

procedure TForm1.Button1Click(Sender: TObject);

begin {TForm1.Button1Click}

Xs:=StrToInt(Edit1.Text); Ys:=StrToInt(Edit2.Text);

Xf:=StrToInt(Edit3.Text); Yf:=StrToInt(Edit4.Text);

ZDA(Xs,Ys,Xf,Yf,clGreen);

end; {TForm1.Button1Click}

end.

Лiтература. [5, стор. 50-54], [8, стор.97-100].

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