МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Институт кибернетики Кафедра информатики и проектирования систем Отчет по лабораторной работе №3 по дисциплине КОМПЬЮТЕРНАЯ ГРАФИКА Разработчик: студент группы 8в83 Сафронов Б.А. Согласовано: доцент Демин А. Ю. Томск 2011 Задание: Реализовать простейший векторный редактор, позволяющий рисовать окружности. Редактировать их за узлы (центр окружности). Функции редактирования: изменение координат центра, изменение радиуса, удаление окружности, задание стилей линий. Окружности рисуются по алгоритму Брезенхейма. Теоретическая часть: Алгоритм Брезенхе́ма (англ. Bresenham's line algorithm) — это алгоритм, определяющий, какие точки двумерного растра нужно закрасить, чтобы получить близкое приближение прямой линии между двумя заданными точками. Это один из старейших алгоритмов в машинной графике — он был разработан Джеком Е. Брезенхэмом (Jack E. Bresenham) в компании IBM в 1962 году. Алгоритм широко используется, в частности, для рисования линий на экране компьютера. Отрезок проводится между двумя точками — (x0,y0) и (x1,y1), где в этих парах указаны колонка и строка, соответственно, номера которых растут вправо и вниз. Сначала мы будем предполагать, что наша линия идёт вниз и вправо, причём горизонтальное расстояние x1 − x0 превосходит вертикальное y1 − y0, т.е. наклон линии от горизонтали — менее 45°. Наша цель состоит в том, чтобы для каждой колонки x между x0 и x1, определить, какая строка y ближе всего к линии, и нарисовать точку (x,y). Также существует алгоритм Брезенхэма для рисования окружностей. По методу построения он похож на рисование линии. В этом алгоритме строится дуга окружности для первого квадранта, а координаты точек окружности для остальных квадрантов получаются симметрично. На каждом шаге алгоритма рассматриваются три пикселя, и из них выбирается наиболее подходящий путём сравнения расстояний от центра до выбранного пикселя с радиусом окружности. Реализация: private void draw() { for (int i = 0; i < a.Count; i++) { int X1 = a[i].e.X; int Y1 = a[i].e.Y; int R = a[i].r; int x = 0; int y = R; int delta = 2 - 2 * R; int error = 0; Color col = a[i].color ; while (y >= 0) { if (isIn(X1 + x, Y1 + y)) draw_lin(X1 + x, Y1 + if (isIn(X1 + x, Y1 - y)) draw_lin(X1 + x, Y1 if (isIn(X1 - x, Y1 + y)) draw_lin(X1 - x, Y1 + if (isIn(X1 - x, Y1 - y)) draw_lin(X1 - x, Y1 error = 2 * (delta + y) if ((delta < 0) && (error { delta += 2 * ++x + 1; continue; } error = 2 * (delta - x) - y,a[i].width, col); y,a[i].width ,col); y,a[i].width ,col); y, a[i].width, col); 1; <= 0)) 1; if ((delta > 0) && (error > 0)) { delta += 1 - 2 * --y; continue; } x++; delta += 2 * (x - y); y--; }} private void draw_lin(int c_x, int c_y, int s,Color colo) { for (int i = c_x - s; i < c_x +s; i++) { for (int j = c_y - s; j < c_y +s; j++) { if (isIn(i, j)&& Math.Sqrt(Math.Pow(i-c_x,2)+Math.Pow(j-c_y,2))<=s) { btmBack.SetPixel(i, j, colo); }}}} Результат: Вывод:В результате выполнения лабораторной работы мною была изучено построение дракона Харпера Хейтуэя и реализован алгоритм на языке Delphi. Построение происходит через прорисовку прямых линий под углом в 90*;