safronovba_kg_3x

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ
ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Институт кибернетики
Кафедра информатики и проектирования систем
Отчет по лабораторной работе №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*;
Download