Алгоритмы вычерчивания графических примитивов
Контрольная работа - Компьютеры, программирование
Другие контрольные работы по предмету Компьютеры, программирование
Контрольная работа
Алгоритмы вычерчивания графических примитивов
Цель работы: Разработать алгоритмы и написать программу, которая будет изображать на поверхности формы графические примитивы: линии, круги, эллипсы.
Выполнение задания:
Поскольку экран растрового дисплея с электронно-лучевой трубкой или ЖК - экраном можно рассматривать как матрицу дискретных элементов (пикселей), каждый из которых может быть подсвечен, нельзя непосредственно провести отрезок из одной точки в другую. Процесс определения пикселей, наилучшим образом аппроксимирующих заданный отрезок, называется разложением в растр.
Рассмотрим:
. Алгоритм разложения в растр прямой линии.
Рис. 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. Круг
Круг, расстояние от которых до заданной точки, называемой центром круга, не превышает заданного неотрицательного числа, называемого радиусом этого круга. Если радиус равен нулю, то круг вырождается в точку.
Для построения круга нам также понадобятся координаты левого верхнего угла круга X1 и Y1 и координаты правого нижнего X2 и Y2, а также плоскость рисования Canvas.
Определим радиус
R := abs(X2 - X1) div 2.
Точку центра круга определим как:
X := X1 + (X2 - X1) div 2;:= Y1 + (Y2 - Y1) div 2;
Теперь зададим нулевой градус: i := 0 и в цикле, пока i не будет <= 359 градусов будем выводит точки по радиусу круга от его центра, а приращение градусов будем делать по 30 минут, для увеличения точности прорисовки контура:
While i <= 359 do begin.Pixels[Trunc(X + R * Sin(i)), Trunc(Y + R * Cos(i))] := clRed; := i + 0.3
end;
. Алгоритм построения эллипса.
Рис. 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);