Алгоритмы вычерчивания графических примитивов
Контрольная работа
«Алгоритмы вычерчивания графических примитивов»
Цель работы: Разработать алгоритмы и написать программу, которая будет изображать на поверхности формы графические примитивы: линии, круги, эллипсы.
Выполнение задания:
Поскольку экран растрового дисплея с электронно-лучевой трубкой или ЖК - экраном можно рассматривать как матрицу дискретных элементов (пикселей), каждый из которых может быть подсвечен, нельзя непосредственно провести отрезок из одной точки в другую. Процесс определения пикселей, наилучшим образом аппроксимирующих заданный отрезок, называется разложением в растр.
Рассмотрим:
. Алгоритм разложения в растр прямой линии.
Рис. 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 | Пользовательское соглашение
ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ