Алгоритмы вычерчивания графических примитивов

 














Контрольная работа

«Алгоритмы вычерчивания графических примитивов»


Цель работы: Разработать алгоритмы и написать программу, которая будет изображать на поверхности формы графические примитивы: линии, круги, эллипсы.

Выполнение задания:

Поскольку экран растрового дисплея с электронно-лучевой трубкой или ЖК - экраном можно рассматривать как матрицу дискретных элементов (пикселей), каждый из которых может быть подсвечен, нельзя непосредственно провести отрезок из одной точки в другую. Процесс определения пикселей, наилучшим образом аппроксимирующих заданный отрезок, называется разложением в растр.

Рассмотрим:

. Алгоритм разложения в растр прямой линии.


Рис. 1. Растеризация отрезка прямой линии

графический примитив алгоритм линия круг

Растром называется прямоугольная сетка точек, формирующих изображение на экране компьютера. Каждая точка растра характеризуется двумя параметрами: своим положением на экране и своим цветом. Растровые изображения состоят из множества дискретных точек, для работы с ними необходимы специальные алгоритмы.

Рисование отрезка прямой линии - одна из простейших задач растровой графики. Смысл ее заключается в вычислении координат пикселей, находящихся вблизи непрерывных отрезков, лежащих на двумерной растровой сетке.



Рис. 2. Алгоритм разложения в растр прямой линии


В функцию алгоритма разложения передаются начальные и конечные координаты, а также плоскость рисования Canvas. Первое, что нужно определить это длину по оси oX или oY, в зависимости от того, которая длиннее:


if abs(X2 - X1) >= abs(Y2 - Y1) then Length := abs(X2 - X1)Length := abs(Y2 - Y1);


Теперь определим приращения для каждой оси:


dX := (X2 - X1) / Length;:= (Y2 - Y1) / Length;


Имея приращения и длину линии, можно построить прямую, но для начала нужно задать начальные координаты построения линии:


X := X1 + 0.5 * Sign(dX);:= Y1 + 0.5 * Sign(dY);


Здесь Sign - функция, которая возвращает -1, если число отрицательно; 1, если число положительно; и 0, если число равно нулю.

Теперь зададим переменную i в начальное состояние:

i := 1;

И запусти цикл, в котором будет осуществляться приращение координат, переменной i и прорисовка в полученных координатах точки, цикл закончится только, когда i <= Length:


i := 1;i <= Length do begin.Pixels[Trunc(X), Trunc(Y)] := clBlue;

X := X + dX;:= Y + dY;:= i + 1

end;


. Алгоритм построения круга.




Рис. 3. Круг


Круг - геометрическое место точек <#"100" src="doc_zip7.jpg" />

Рис. 4. Эллипс


Эллипсом - называется геометрическое место точек, сумма расстояний от которых до двух заданных точек F1 и F2, называемых фокусами эллипса, есть величина постоянная.

Этот алгоритм отличается только лишь тем, что используется не один радиус, а два: по оси oX и oY. Соответственно прорисовка изменится только лишь приращениями разных радиусов:


Canvas.Pixels[Trunc(X + xR * Sin(i)), Trunc(Y + yR * Cos(i))] := clLime;


Рис. 5. Построение эллипса


Блок-схемы алгоритмов:

Блок-схема линии



Блок-схема круга


Блок-схема эллипса



Листинг программы:


unit ULab1;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, XPMan;= class(TForm): TButton;: TRadioGroup;: TPaintBox;ButtonClearClick(Sender: TObject);PaintBoxPaint(Sender: TObject);PaintBoxMouseDown(Sender: TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);PaintBoxMouseUp(Sender: TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);;: TMainForm;, SY: Word;Line(X1, Y1, X2, Y2: Word; Canvas: TCanvas);Circle(X1, Y1, X2, Y2: Word; Canvas: TCanvas);Ellipse(X1, Y1, X2, Y2: Word; Canvas: TCanvas);

{$R *.dfm}Sign(Val: Single): ShortInt;Val > 0 then Result := 1 elseVal < 0 then Result := -1Result := 0;Line(X1, Y1, X2, Y2: Word; Canvas: TCanvas);i, Leng: Word;, Y, dX, dY: Single;abs(X2 - X1) >= abs(Y2 - Y1) then Leng := abs(X1 - X2)Leng := abs(Y1 - Y2); // Длина

// Приращения

dX := (X2 - X1) / Leng;

dY := (Y2 - Y1) / Leng;:= X1 + 0.5*Sign(dX);:= Y1 + 0.5*Sign(dY);:= 1;i <= Leng do begin.Pixels[Trunc(X), Trunc(Y)] := clBlue;

X := X + dX;:= Y + dY;:= i + 1

end;Circle(X1, Y1, X2, Y2: Word; Canvas: TCanvas);R, X, Y: Word;: Single;:= abs(X1 - X2) div 2; // Радиус

// Центр

X := X1 + (X2 - X1) div 2;

Y := Y1 + (Y2 - Y1) div 2;:= 0;i <= 359 do begin.Pixels[Trunc(X + R * Sin(i)), Trunc(Y + R * Cos(i))] := clRed;:= i + 0.1;;Ellipse(X1, Y1, X2, Y2: Word; Canvas: TCanvas);xR, yR, X, Y: Word;: Single;:= abs(X1 - X2) div 2; // Радиус X:= abs(Y1 - Y2) div 2; // Радиус Y

// Центр

X := X1 + (X2 - X1) div 2;

Y := Y1 + (Y2 - Y1) div 2;:= 0;i <= 359 do begin.Pixels[Trunc(X + xR * Sin(i)), Trunc(Y + yR * Cos(i))] := clLime;:= i + 0.1;;TMainForm.ButtonClearClick(Sender: TObject);PaintBox.Canvas do begin.Color := clBlack;(PaintBox.ClientRect);TMainForm.PaintBoxPaint(Sender: TObject);.Click;TMainForm.PaintBoxMouseDown(Sender: TObject;: TMouseButton; Shift: TShiftState; X, Y: Integer);:= X;:= Y;TMainForm.PaintBoxMouseUp(Sender: TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);ElementsGroup.ItemIndex of

: Line(SX, SY, X, Y, PaintBox.Canvas);

: Circle(SX, SY, X, Y, PaintBox.Canvas);

: Ellipse(SX, SY, X, Y, PaintBox.Canvas);

end;

end.


Вывод: В ходе проделанной контрольной работы были разработаны алгоритмы. Была написана программа, которая изображает на поверхности формы графические примитивы: линии, круги, эллипсы.


Контрольная работа «Алгоритмы вычерчивания графических примитивов» Цель работы: Разработ

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ