Алгоритмы вычерчивания графических примитивов
Контрольная работа
«Алгоритмы вычерчивания графических
примитивов»
Цель работы: Разработать алгоритмы и написать программу, которая будет
изображать на поверхности формы графические примитивы: линии, круги, эллипсы.
Выполнение задания:
Поскольку экран растрового дисплея с электронно-лучевой трубкой или ЖК -
экраном можно рассматривать как матрицу дискретных элементов (пикселей), каждый
из которых может быть подсвечен, нельзя непосредственно провести отрезок из
одной точки в другую. Процесс определения пикселей, наилучшим образом
аппроксимирующих заданный отрезок, называется разложением в растр.
Рассмотрим:
. Алгоритм разложения в растр прямой линии.
Рис. 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 :=
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. Круг
Круг - геометрическое
место точек
<#"564473.files/image007.gif">
Рис.
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.
Вывод: В ходе проделанной контрольной работы были разработаны алгоритмы. Была написана
программа, которая изображает на поверхности формы графические примитивы:
линии, круги, эллипсы.