otchet_laba_2_kompyuternaya_grafika
.docxМинистерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра компьютерных систем в управлении и проектировании (КСУП)
ОТЧЕТ
К лабораторной работе №2 по дисциплине «компьютерная графика».
Алгоритмы растровой графики. Построение векторов и окружностей.
Вариант 2
Студентка гр.583-1
_______ Аригунова И.Н.
«___»_____________2014 г.
Принял:
_____________________
_____________________
«___»_____________2014 г.
Введение
Цель работы – изучение и реализация алгоритмов растровой графики: генерация отрезка алгоритмами Брезенхема, цифровым дифференциальным симметричным и несимметричным, генерация окружности и вывод линий разных стилей.
Задание лабораторную работу №2
-
В проекте реализовать вывод отрезков обычным ЦДА.
-
Добавить возможность вывода толстой линии.
-
Реализовать вывод на экран фигуры. Координаты вводятся с клавиатуры (использовать компоненты Edit).
Описание работы
С помощью ЦДА решается дифференциальное уравнение отрезка, имеющее вид:
где Py = Yk – Yn приращение по Y
Px = Xk – Xn приращение по Х
Xn, Yn – начальные координаты точки отрезка
Xk, Yk – конечные координаты точки отрезка
Затем определяется количество узлов N. За N циклов вычисляются координаты следующих узлов:
Получаемые значения округляются до целочисленных. Пиксель выводится на экран.
Координаты начала и конца отрезка будем задавать в интерактивном режиме: пользователь нажимает на правую кнопку мыши (начало отрезка) , затем, не отпуская, протягивает отрезок до конечной точки, отпускает правую кнопку – на экране появляется отрезок.
-
Создать проект
-
Создать форму, как изображено на рисунке ниже
Рисунок 1. Интерфейс программы
-
Написать программный код вывода отрезка. Координаты начальной точки фиксируются нажатием правой кнопки мыши на компоненте PaintBox. Для этого в Events инспектора объектов напротив события OnMouseDown сделать двойной щелчок и перейти к редактированию кода.
-
Конечная точка фиксируется при отпускании кнопки мыши. Использовать событие OnMouseUp и отредактировать код.
-
Ввести кнопку для очистки поля рисования. Прописать процедуру очистки поля PaintBox.
-
Чтобы вывести толстую линию нужно использовать ЦДА. Должен закрашиваться не только полученный пиксель, но и соседние.
-
Для вывода многоугольника использовать массив точек.
Рисунок 1. Результат работы программы
Результат работы программы на рисунке 2.
Контрольные вопросы к лабораторной работе №2
-
Опишите кратко алгоритм генерации отрезка ЦДА
-
Определить количество узлов N, используемых для построения отрезка
-
За N циклов вычисляются координаты очередных точек отрезка.
-
Полученные значения преобразуются в целочисленные и пиксель с данными координатами рисуется на экране
-
Чем отличаются обычный и несимметричный алгоритмы ЦДА?
В несимметричном алгоритме ЦДА можно работать с нецелыми значениями координат отрезка, в обычном алгоритме только с целыми.
-
Кратко опишите основную идею алгоритма Брезенхема генерации отрезка
Основная идея алгоритма состоит в том, что если угловой коэффициент прямой < ½, то точку, следующую за точкой (0;0), поставить в позицию (1;0), а если угловой коэффициент > ½, то в позицию (1;1). Для принятия решение, куда заносить очередной пиксел, вводится величина отклонения Е точной позиции от середины между двумя возможными растровыми точками в направлении наименьшей относительной координаты. Знак Е используется как критерий для выбора ближайшей растровой точки.
Если E<0, то точное Y-значение округляется до последнего целочисленного значения, в противном случае увеличивается на1.
-
Опишите алгоритм генерации окружности
По методу построения он похож на рисование линии. В этом алгоритме строится дуга окружности для первого квадранта, а координаты точек окружности для остальных квадрантов получаются симметрично. На каждом шаге алгоритма рассматриваются три пикселя, и из них выбирается наиболее подходящий путём сравнения расстояний от центра до выбранного пикселя с радиусом окружности.
-
Что такое «растр»?
Растр — точечная структура графического изображения при печати.
-
Что такое растровая компьютерная графика?
Растровая компьютерная графика основывается на представлении изображения в виде совокупности отдельных точек/пикселей.
-
Что такое «пиксель»?
Пиксель – это мельчайшая единица изображения в растровой графике. Представляет собой неделимый объект прямоугольной формы, обладающий определенным цветом, градацией серого или прозрачностью.
-
Как получить отображение толстой линии?
Чтобы получить отображение толстой линии, нужно взять алгоритм вывода тонкой линии и вместо вывода отдельного пиксела поставить вывод фигуры или линии, соответствующей перу.
-
Как получить отображение пунктирной линии?
Чтобы получить отображение пунктирной линии, нужно взять алгоритм
вывода тонкой непрерывной линии и ввести новую переменную – счетчик пикселов линии. Если она удовлетворяет некоторому условию, то рисуется пиксель заданного цвета с текущими координатами.
Заключение
В данной лабораторной работе были реализованы алгоритмы растровой графики: обычный ЦДА, вывод толстой линии, а также построение многоугольников по заданным точкам.
Приложение А
Листинг программы
procedure TForm1.pb1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (rb1.Checked or rb2.Checked) then
begin
xn:=X; yn:= Y;
end
else
ShowMessage('вы не выбрали алгоритм ввода фигуры');
end;
procedure TForm1.pb1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var i, j, dx,dy: Integer;
xt, yt: Real;
begin
xk:= X;
yk:= Y;
dx:= xk-xn;
dy:= yk-yn;
n:=1000;
xt:=xn;
yt:=yn;
if (rb1.Checked) then
for i:=1 to n do
begin
pb1.Canvas.Pixels[round(xt), round(yt)] := clBlack;
xt:= xt+dx/n;
yt:= yt+dy/n;
end;
if (rb2.Checked) then
for j:=1 to n do
begin
pb1.Canvas.Pixels[round(xt), round(yt)] := clBlack;
pb1.Canvas.Pixels[round(xt+1), round(yt+1)] := clBlack;
pb1.Canvas.Pixels[round(xt+2), round(yt+2)] := clBlack;
pb1.Canvas.Pixels[round(xt-1), round(yt-1)] := clBlack;
pb1.Canvas.Pixels[round(xt-2), round(yt-2)] := clBlack;
xt:= xt+dx/n;
yt:= yt+dy/n;
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
var i , j :Integer;
begin
for i := 0 to pb1.Width do
for j := 0 to pb1.Height do
pb1.Canvas.Pixels[i,j]:= clWhite;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
x1:= StrToInt(edt1.Text);
x2:= StrToInt(edt2.Text);
x3:= StrToInt(edt3.Text);
x4:= StrToInt(edt4.Text);
x5:= StrToInt(edt5.Text);
y1:= StrToInt(edt6.Text);
y2:= StrToInt(edt7.Text);
y3:= StrToInt(edt8.Text);
y4:= StrToInt(edt9.Text);
y5:= StrToInt(edt10.Text);
ptArray[0]:=Point(x1, y1);
ptArray[1]:=Point(x2, y2);
ptArray[2]:=Point(x3, y3);
ptArray[3]:=Point(x4, y4);
ptArray[4]:=Point(x5, y5);
pb1.Canvas.Polygon(ptArray);
end;
end.