Конспект 4-3 (Конспект лекций)
Описание файла
Файл "Конспект 4-3" внутри архива находится в папке "Конспект лекций". Документ из архива "Конспект лекций", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 10 семестр (2 семестр магистратуры), которые можно найти в файловом архиве МАИ. Не смотря на прямую связь этого архива с МАИ, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "компьютерная рафика" в общих файлах.
Онлайн просмотр документа "Конспект 4-3"
Текст из документа "Конспект 4-3"
Т
огда точки плоскости X = 0 разбиваются на три класса:
-
точки Z > 0, которые имеют 2 прообраза на поверхности,
-
точки на оси Oy, которые имеют 1 прообраз на поверхности,
-
точки, у которых нет прообразов на поверхности.
Такая особенность проецирования (или вид поверхности) называется складкой.
3. Поверхность, заданная уравнением
Z = X3 + XY или X3 + XY- Z = 0 (см. рис. 45)
Нормальный вектор
N = ( 3 X2 + Y, X, -1 )
скалярное произведение
( N, L ) = 3X2 + Y.
Исходя из уравнения
3 X2 + Y = 0
находим на поверхности кривую, вдоль которой вектора N и L ортогональны. Это полукубическая парабола
27 Z2 = - 4Y3,
которая на плоскости X = 0 делит точки на три класса:
-
точки, имеющие 1 прообраз на поверхности,
-
точки на параболе, которые имеют 2 прообраза на поверхности,
-
точки внутри острия, имеющие 3 прообраза на поверхности.
Эта особенность проецирования называется сборкой.
Существует теория особенностей (теория катастроф), которая доказывает, что при проецировании на плоскость произвольного гладкого объекта (т.е. поверхности) возможны только 3 указанных типа проекции (обыкновенная, складка или сборка) с точностью до малого шевеления.
Это значит, что более сложные особенности оказываются неустойчивыми и при малых изменениях направления проецирования либо взаимного расположения поверхности и картинной плоскости эти особенности переходят в более простые.
Алгоритмы компьютерной графики
РАСТРОВЫЕ АЛГОРИТМЫ
Большинство графических устройств является растровыми, т.е. представляют изображение в виде матрицы пикселей (или растра), поэтому большинство графических библиотек содержит набор растровых алгоритмов.
Рассмотрим графическую библиотеку компилятора Borland C++, которая содержит все необходимые файлы для работы с графикой.
Для инициализации библиотеки служит функция
v
oid far initgraph(int_far*driver, int_far*mode, char_far*path)
где *driver – задает тип адаптера,
*mode – определяет режим, например,
*path – имя каталога, где находится драйвер адаптера (файл типа BGI – Borland Graphics Interface).
Функция graphresult возвращает код завершения предыдущей графической операции
int far graphresult (void)
Любая графическая библиотека (в том числе и рассматриваемая) содержит модули для реализации основных графических объектов:
-
линейные изображения (отрезки прямых, дуги окружностей, дуги эллипсов),
-
сплошные объекты, т.е. растровые образы двумерных областей (круг, прямоугольник, эллипс),
-
шрифты,
-
изображения, т.е. прямоугольные матрицы пикселей, независимо от содержания.
Эти объекты называются также графическими примитивами.
Библиотека Borland C++ содержится в файле graphics.h. Примеры функций графики из этой библиотеки приведены в табл.6.
Общий вид вызова функции:
{имя} ( {параметры} )
Таблица 6
Вызов | Выполняемая функция | Примечания |
Для рисования линейных изображений | ||
clearviewport(void) | очистка экрана | |
putpixel(x,y) | ставит точку заданного цвета | x,y – координаты точки, Col – номер цвета |
getpixel(x,y) | возвращает цвет точки | |
setcolor(Col) | устанавливает цвет пера | |
line(x1,y1,x2,y2) | линия | x1,y1 – координаты начала, x2,y2 – координаты конца |
circle(x,y,r) | окружность | x,y – координаты центра, r – радиус |
arc(x,y,N,K,r) | дуга окружности | N,K –начало и конец дуги в градусах против часовой стрелки |
ellipse(x,y,N,K,rx,ry) | дуга эллипса | rx, ry –радиусы по Ox и Oy |
Для двумерных областей (закраска) | ||
setfillstyle(Pat,Col) | задание кисти | используются совместно |
setfillpattern(Pat,Col) | пользователь-ский шаблон кисти | |
bar(x1,y1,x2,y2) | закраска прямоугольни-ка | x1,y1 – коорд. верхнего лево-го угла, x2,y2 – коорд. право-го нижнего угла |
Работа со шрифтами | ||
settextstyle(Font,Dir,Size) | выбор шрифта | |
outtextxy(x,y,Text) | вывод текста | x,y – коорд. верхнего левого угла первого символа |
Рассмотрим функцию выбора шрифта
void far settextstyle (int Font, int Direction, int Size);
где Font – задает идентификатор одного из шрифтов и соответствует обращению к набору символов (матриц 8х8 пикселей), изображающих
каждый символ; может принимать значения
Direction – определяет ориертацию текста (горизонтальная или вертикальная):
Size – указывает, во сколько раз нужно увеличить шрифт перед выводом на экран. Например, для шрифта DEFAULT_FONT возможны значения:
1 - матрица 8х8 пикселей,
2 - матрица 16х16 пикселей,
. . .
10 – матрица 80х80 пикселей.
Приведем типовую форму файла с использованием графики и вывода текста на экран.
# include
# include
# include
# include
int main (void)
{
int driver = DETECT, gmode, errorcode;
int x,y;
initgraph(&gdriver,&gmode);
errorcode = graphresult();
if (errorcode != OK)
{
printf(“Graph. error:%s\n”,grapherrormsg(errorcode));
printf(“Press any key to halt:”);
getch();
exit(1);
}
printf(“Graph.error:%S\n”,grapherrormsg(errorcode));
x=getmaxx()/2;
y=getmaxy()/2;
settextstyle(GOTHIC_FONT, GORIZ_DIR,8);
outtextxy(x,y, ”Press any key to close a gr.sys:”);
getch();
closegraph();
printf(“We are now back in text mode.\n”);
printf(“Press any key to halt:”);
getch();
return0;
}
АЛГОРИТМЫ ВЫЧЕРЧИВАНИЯ ЛИНИЙ
Функции вычерчивания линий являются основными подпрограммами графики и используются для отображения линий в заданном цвете путем задания начальных и конечных координат. Для растровой графики построение линий в общем виде представляет определенную проблему.
Важным понятием растровой графики является связность, т.е. возможность соединения двух пикселей растровой линией (последовательным набором пикселей). Линия состоит из соседних одинаково закрашенных пикселей.
И
спользуется два понятия связности для точек a1(x1,y1) и a2(x2,y2) (см. рис.46).
Понятие 4-хсвязности более строгое, чем 8-связность (т.е. является частным случаем).
В качестве линии на растровой сетке выступает набор пикселей p1,p2,…,pn , где два пикселя pi, pi+1 являются соседними; линия может быть определена в смысле 4-хсвязной или 8-связной.
Одним из подходов к вычерчиванию линии является использование соотношения между смещением по координатам х и у.
Для простоты считаем, что
0 y2-y1 x2-x1
о
трезок описывается уравнением
или y = k x + b.
П
усть требуется провести линию от a1(0,0) и a2(10,5). Тогда смещения
y = 5 и y = 10, а соотношение
определяет коэффициент зависимости, по которому должны меняться координаты x и y при изображении линий, но для этого требуется обработка чисел с плавающей запятой, что снижает быстродействие.
Этот метод используется довольно редко.
Наиболее популярный метод изображения линий основан на алгоритме Брезенхейма (Bresenhame), предложенный в 1965 г. для растрового построения отрезка.
Алгоритм Брезенхейма отличается тем, что не требуется выполнять деление или умножение чисел с плавающей точкой. Вместо этого отношение между значениями координат x и y представляется косвенно через серии сложений и вычитаний. Основная идея алгоритма Брезенхейма – это регистрация средних значений погрешностей между идеальным положением каждой точки и той позицией на экране дисплея, в которой она реально отображается.
В принципе, алгоритм применим для любой формы линии. Его суть – итерационный процесс поиска соседних точек, начиная с точки a1(x1,y1).
Алгоритм Брезенхейма:
а) в каждой итерации цикла вычерчивания линии вычисляются 2 погрешности по осям x и y, которые увеличиваются с изменением координат x и y соответственно;
б) если значение погрешности достигает определенной величины, оно вновь устанавливается в 0, а соответствующая координата увеличивается на 1;
в) этот процесс продолжается, пока вся линия не будет построена полностью и мы не попадем в точку конца.
П ри построении отрезка прямой всегда выбирается ближайший по вертикали пиксель (см. рис.47).
П ри этом из двух точек А и В A
выбирается та, которая ближе к a{
исходной прямой, т.е. точка А, т.к. }b
a < b . B
Для этого вводится число, равное
d = (x2-x1)(b-a) Рис. 47.
Если d>0, то значение y от предыдущей точки увеличивается на 1, а d – на 2(y -x), в противном случае значение y не изменяется, а d = 2 y.
Тогда простейший алгоритм для того же примера
0 y2-y1 x2-x1
имеет вид:
void line ( int x1, int y1, int x2, int y2, int Color )
{
int dx = x2-x1;
int dy = y2-y1;
int d = (dy<<1)- dx;
int d1 = dy<<1;
int d2 = (dy-dx)<<1;
putpixel(x1,y1,Color);
for (int x = x1+1; y = y1; x<=x2; x++)
{
if (d>0) { d+ = d2; y+ = 1;
}
else d+ = d1;
putpixel(x,y,Color);
}
}
Для дуг окружностей и эллипсов приращения и погрешности вычисляются по более сложным выражениям.
ВЫЧЕРЧИВАНИЕ ОТРЕЗКОВ
Необходимость отсечь видимое изображение по границам некоторой области встречается довольно часто.
Алгоритм Сазерленда-Кохена
Пусть область отсечения ограничена прямоугольником (см. рис. 48а). Четыре линии, образующие прямоугольник, делят плоскость на 9 областей, которые могут быть закодированы тетрадой Code (см. рис. 48б).
Каждый бит тетрады имеет смысл:
1>1>1>