Алгоритмы заполнения различных фигур определенным стилем

     Оглавление

Введение…………………………………………………………………………...3

  1. Стиль заполнения. Кисть. Текстура……………………………………………………………………………5
  2. Алгоритмы заполнения различных фигур определенным стилем……………………………………………………………………………...8

Заключение……………………………………………………………………….20

Список литературы………………………………………………………………21 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

     Введение

     Компьютерная  графика прочно вошла в нашу жизнь. Она используется почти во всех научных  и инженерных дисциплинах для  наглядности и восприятия, передачи информации. Применяется в медицине, рекламном бизнесе, индустрии развлечений и т. д.   Компьютерная графика - это и новые эффективные технические средства для проектировщиков, конструкторов и исследователей, и программные системы и машинные языки, и новые научные, учебные дисциплины, родившиеся на базе синтеза таких наук как аналитическая, прикладная и начертательная геометрии, программирование для ПК, методы вычислительной математики и т.п. Конечным продуктом компьютерной графики является изображение. Машина наглядно изображает такие сложные геометрические объекты, которые раньше математики даже не пытались изобразить.

     Это изображение может использоваться в различных сферах, например, оно  может быть техническим чертежом, иллюстрацией с изображением детали в руководстве по эксплуатации, простой  диаграммой, архитектурным видом предполагаемой конструкции или проектным заданием, рекламной иллюстрацией или кадром из мультфильма.

     В цифровом мире имеется два основных способа представления изображений.

     В обоих случаях реальное непрерывное  изображение разбивается на элементарные объекты, но описываемые различными методами. Один способ - векторная графика - представляет собой математическое описание составляющих элементов (объектов) изображения - кривых и прямых линий, а также элементарных геометрических фигур (прямоугольников, эллипсов и т.п.). Другой способ, растровая графика, заключается в том, что реальное непрерывное изображение разбивается на точки, называемые пикселами, причем каждая точка обладает точно определенными координатами (номер строки и столбца, как ячейки таблицы). Кроме этих двух видов графики, в отдельные виды выделяют фрактальную графику, трехмерные (3D) изображения, анимацию (2D и 3D) и изображения для Web, хотя все они, по сути, являются какой-либо разновидностью либо векторных изображений, либо растровых, либо используют механизмы и той, и другой одновременно.

     Объектом  исследования данной курсовой работы является компьютерная графика.

     Предметом исследования является алгоритмы заполнения фигур определенным стилем.

     Цель  работы - разработать алгоритмы заполнения различных фигур определенным стилем на языке Pascal .

     Были  выделены следующие задачи:

     - изучить литературу по проблеме  исследования.

     -определить  существующие стили заполнения.

     - выявить возможности и средства  компьютерной графики в Турбо Паскале.

     - разработать алгоритмы заполнения  различных фигур определенным  стилем на языке Pascal . 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

    1. Стиль заполнения. Кисть. Текстура
 

     При выводе фигур могут использоваться различные стили заполнения. Для  обозначения стилей заполнения, отличных от сплошного стиля, используют такие понятия, как кисть и текстура. Их можно считать синонимами, однако понятие текстуры обычно используется применительно к трехмерным объектам, а кисть — для изображения двумерных объектов. Текстура — это стиль заполнения, закрашивание, которое имитирует сложную рельефную объемную поверхность, выполненную из какого-то материала. Для описания алгоритмов заполнения фигур с определенным стилем используем тот же способ, что и для описания алгоритмов рисования линий. Описание всех разновидностей подобных алгоритмов можно дать с помощью такой обобщенной схемы:  

     Вывод пиксела заполнения цвета С с координатами (x,y)

     Например, в алгоритме вывода полигонов  пикселы заполнения рисуются в теле цикла горизонталей, а все другие операции предназначены для подсчета координат (х, у) этих пикселов. Сплошное заполнение означает, что цвет (С) всех пикселов одинаков, то есть C=const. Нам нужно как-то изменять цвет пикселов заполнения, чтобы получить определенный узор. Преобразуем алгоритм заполнения следующим образом:

     C=f(x,y)

     Вывод пиксела заполнения (x,y) цветом С

     Функция f(x,y) будет определять стиль заполнения. Аргументами функции цвета являются координаты текущего пиксела заполнения. Однако в отдельных случаях эти аргументы не нужны. Например, если цвет С вычислять как случайное значение в определенных границах: С = random (), то можно создать иллюзию шершавой матовой поверхности (рис. 1).

       
 

     Другой  стиль заполнения — штриховой (рис. 2). Для него функцию цвета также можно записать в аналитической форме:

 
 

Где S – период, а Т – толщина штрихов, Сш – цвет штрихов, Сф – цвет фона.  

     Если  не рисовать пикселы фона, то можно  создать иллюзию полупрозрачной фигуры. Подобную функцию можно записать и для других типов штриховки. Аналитическая форма описания стиля заполнение позволяет достаточно просто изменять размеры штрихов при изменениях масштаба показа, например, для обеспечения режима WYSIWYG.

     Зачастую  при использовании кистей и текстур  используется копирование небольших растровых изображений. Такой алгоритм заполнения можно описать вышеупомянутой общей схемой, если строку

     С=f(x,у) заменить двумя другими строками:

Координаты  пиксела заполнения (x,  y) преобра зуем в растровые координаты образца кисти (xT  ,y)

По  координатам  (xT  ,y)    определяем цвет (С) пиксела в образце кисти

Вывод пиксела заполнения цвета С с координатами  (x,  y)  

     Преобразование  координат пиксела заполнения (х, у) в координаты внутри образца кисти можно выполнить таким образом:

     xT= x mod m,

     yT= y mod n, 

     где т, п — размеры растра кисти соответственно по горизонтали и вертикали. При этом координаты Т, уТ) будут в диапазоне хТ= 0...m- 1, уТ =0...п - 1 при любых значениях х и у. Таким образом, обеспечивается циклическое копирование фрагментов кисти внутри области заполнения фигуры (рис. 3).

  
 

     Удобно, когда размеры кисти равны степени двойки. В этом случае вместо операций взятия остатка (mod) можно использовать более быстродействующие для цифровых компьютеров поразрядные двоичные операции. Приведем пример вычисления остатка от деления на 16.

     Биты  двоичного кода числа  Х:

      х   х  .  .  .  х х х х х

Х mod 16 = 0 0 . . . 0  x  x  x  x 

     Здесь можно использовать поразрядную  операцию & (И). Еще один пример. Если необходимо вычислить X mod 256, а значение X записано в регистре АХ микропроцессора (совместимого с 80x86), то в качестве результата достаточно взять содержимое младшей байтовой части этого регистра — AL.

     Одна  из проблем наложения текстур  заключается в том, что преобразование растровых образцов (повороты, изменение  размеров и тому подобное) приводят к ухудшению качества растров. Повороты растра добавляют ступенчатость (aliasing); увеличение размеров укрупняет пикселы, а уменьшение размеров растра приводит к потере многих пикселов образца текстуры, появляется муар. Для улучшения текстурованных изображений используют методы фильтрации (интерполяции) растров текстур [41, 47]. Также используются несколько образцов текстур для различных ракурсов показа (mipmaps) — компьютерная система во время отображения находит в памяти наиболее пригодный растровый образец.

     Для использования текстур необходим достаточный объем памяти компьютера — количество растровых образцов может достигать десятков, сотен и более в зависимости от количества типов объектов и многообразия пространственных сцен. Чтобы как можно быстрее создавать изображение, необходимо сохранять текстуры в оперативной памяти.

     Для экономии памяти, выделяемой для текстур, можно использовать блочное текстурирование. Текстура здесь уже не представляет всю грань целиком, а лишь отдельный  фрагмент, который циклически повторяется в грани. Это напоминает процесс размножения рисунка кисти при закрашивании полигонов.

     Разумеется, далеко не для всех объектов можно  использовать такой способ отображения, однако, например, для образцов современной  массовой "коробочной" архитектуры в этом плане имеются практически неограниченные возможности (рис. 4).

     Современные видеоадаптеры оснащены графическими процессорами, которые аппаратно поддерживают операции с текстурами [4, 122].

  
 
 
 
 
 

2. Алгоритмы  заполнения различных фигур определенным стилем 

     В этом параграфе рассмотрим примеры заполнения некоторых геометрических фигур, таких как квадрат, круг и треугольник, разными стилями. Например, точками, прямыми и наклонными линиями, и небольшими растровыми изображениями – окружностями, а так же сделаем их поверхность матовой.

  1. Алгоритм заполнения квадрата разными стилями:
    1. Заполнение точками:

     Uses Graph;{подключение модуля Graph}

     Var Driver,Mode:Integer;{определяет тип и задает режим работы графического драйвера}

     X,Y,c:Integer;

     Begin

     {Инициализация  графического режима}

     Driver:=Detect;

     InitGraph(Driver,Mode,'C:\tp\BGI');

     SetColor(4);{красный цвет рисунка}

     SetBkColor(0);{черный цвет фона}

     rectangle(400,200,600,400);{Прямоугольник с заданными координатами верхнего левого угла и нижнего правого угла }

     for x:=400 to 600 do begin{перебираем  координаты точки по х }

     for y:=200 to 400 do begin{перебираем  координаты точки по у }

     If ((x>400) and (x<600) and (y>200) and (y<400)) then  begin{ограничиваем область заполнения квадратом}

       if ((x mod 5) <2)and ((y mod 5)<2)  {задаем условие расстановки точек}

     then c:=4 else c:=0;

     PutPixel(x,y,c);{процедура выставления точки с заданными координатами и цветом}

     end;

     end;

         end;

     ReadLn;{задержка изображения на экране до нажатия enter}

     CloseGraph;{выход из графического режима в символьный}

     End.

    1. Заполнение прямыми линиями:

     Измененный фрагмент программы :

     if ((y) mod 10)<2 {задаем условие расстановки точек}

     с) Заполнение наклонными линиями:

     Измененный фрагмент программы :

     if ((x+y) mod 5)<2 {задаем условие расстановки точек}

     d)Заполнение небольшими растровыми изображениями – окружностями:

     Uses Graph;{подключение модуля Graph}

     Var Driver,Mode:Integer;{определяет тип и задает режим работы графического драйвера}

     X,Y,c:Integer;

     Begin

     {Инициализация  графического режима}

     Driver:=Detect;

     InitGraph(Driver,Mode,'C:\tp\BGI');

     SetColor(4);{красный цвет рисунка}

     SetBkColor(0);{черный цвет фона}

     rectangle(400,200,600,400);{Прямоугольник с заданными координатами верхнего левого угла и нижнего правого угла }

     for x:=400 to 600 do {перебираем  координаты точки по х }

     for y:=200 to 400 do {перебираем  координаты точки по у }

     if ((x mod 5) <2)and ((y mod 5)<2) then begin {задаем условие расстановки точек}

     a:=0; {начальное значение угла окружности}

          {перебираем все углы окружности с шагом 0,1}

     while (a<6.28) do begin {цикл с предусловием}

     ax:=Round(cos(a)*4)+x;{задаем параметрическое уравнение для окружности, которая служит стилем заполнения}

       ay:=Round(sin(a)*4)+y; {задаем параметрическое уравнение для окружности, которая служит стилем заполнения }

     If ((ax>400) and (ax<600) and (ay>200) and (ay<400)) then  begin{ограничиваем область заполнения квадратом}

         c:=4; end else c:=0;

     PutPixel(ax,ay,c); {процедура выставления точки с заданными координатами и цветом}

          a:=a+0.1;{шаг}

     end;

     end;

     ReadLn; {задержка изображения на экране до нажатия enter}

     CloseGraph; {выход из графического режима в символьный}

     End.

     e) Матовая поверхность квадрата:

     Uses Graph;{подключение модуля Graph}

     Var Driver,Mode:Integer;{определяет тип и задает режим работы графического драйвера}

     X,Y:Integer;

     Begin

     {Инициализация  графического режима}

     Driver:=Detect;

     InitGraph(Driver,Mode,'C:\tp\BGI');

         SetColor(4);{красный цвет рисунка}

     SetBkColor(0);{черный цвет фона}

     rectangle(400,300,600,500);{Прямоугольник с заданными координатами верхнего левого угла и нижнего правого угла }

     for x:=401 to 599 do {перебираем  координаты точки по х }

     for y:=301 to 499 do {перебираем  координаты точки по у }

     If ((ax>400) and (ax<600) and (ay>200) and (ay<400)) then  begin{ограничиваем область заполнения квадратом}

     PutPixel(x,y,random(16));{процедура выставления точки с заданными координатами и цветом, который определяется функцией псевдослучайного числа в интервале от [0,16)}

     ReadLn; {задержка изображения на экране до нажатия enter}

     CloseGraph; {выход из графического режима в символьный}

     End.

       Алгоритм заполнения окружности разными стилями:

     а) Заполнение точками:

     Uses Graph; {подключение модуля Graph}

     Var Driver,Mode:Integer; {определяет тип и задает режим работы графического драйвера}

     X,Y,xc,yc,c:Integer;

     R:LongInt;

     Begin

     {Инициализация  графического режима}

     Driver:=Detect;

     InitGraph(Driver,Mode,'C:\tp\BGI');

     SetColor(4); {красный цвет рисунка}

     SetBkColor(0); {черный цвет фона}

     xc:=500;{координата центра окружности по х}

     yc:=200; {координата центра окружности по y}

     Circle(xc,yc,100); {Окружность с заданным центром и радиусом}

     For  X:=400 to 600 do {перебираем  координаты точки по х }

     For  Y:=100 to 300  do{перебираем  координаты точки по у }

     If( sqr(x-xc ))+(sqr(y-yc))<99*99  then begin {ограничиваем область заполнения окружностью}

       if ((x mod 5)<2) and ((y mod 5)<2)  {задаем условие расстановки точек}

     then c:=4 else c:=0;

     PutPixel(x,y,c); {процедура выставления точки с заданными координатами и цветом}

     end;

     ReadLn; {задержка изображения на экране до нажатия enter}

     CloseGraph; {выход из графического режима в символьный}

     End.

     b) Заполнение прямыми линиями:

     Измененный фрагмент программы:

     If y mod 10<2 {задаем условие расстановки точек}

    1. Заполнение наклонными линиями:

     Измененный фрагмент программы:

     if(((y+x) mod 10)<2) {задаем условие расстановки точек}

  1. Заполнение небольшими растровыми изображениями – окружностями:

     Uses Graph; {подключение модуля Graph}

     Var Driver,Mode:Integer; {определяет тип и задает режим работы графического драйвера}

     X,Y,xc,yc, c, ax, ay :Integer;

     R:LongInt;

     a:real;

     Begin

     {Инициализация  графического режима}

     Driver:=Detect;

     InitGraph(Driver,Mode,'C:\tp\BGI');

     SetColor(4); {красный цвет рисунка}

     SetBkColor(0); {черный цвет фона}

     xc:=500; {координата центра окружности по х}

     yc:=200; {координата центра окружности по y}

     Circle(xc,yc,100); {Окружность с заданным центром и радиусом}

     For  X:=400 to 600 do { перебираем  координаты точки по х }

     For  Y:=100 to 300  do { перебираем  координаты точки по у }

         if ((x mod 15)<1) and ((y mod 15)<1) then begin{задаем условие расстановки точек}

     a:=0; {начальное значение угла окружности}

     {перебираем все углы окружности с шагом 0,1}

     while (a<6.28) do begin {цикл с предусловием}

       ax:=Round(cos(a)*4)+x;{задаем параметрическое уравнение для окружности, которая служит стилем заполнения}

       ay:=Round(sin(a)*4)+y; {задаем параметрическое уравнение для окружности, которая служит стилем заполнения }

       If( sqr(ax-xc ))+(sqr(ay-yc))<100*100  then begin {ограничиваем область заполнения окружностью}

       c:=4; end else c:=0;

       PutPixel(ax,ay,c); {процедура выставления точки с заданными координатами и цветом}

         a:=a+0.1;{шаг}

     end;

     end;

     ReadLn; {задержка изображения на экране до нажатия enter}

     CloseGraph; {выход из графического режима в символьный}

     End.

  1. Матовая поверхность окружности:

     Uses Graph; {подключение модуля Graph}

     Var Driver,Mode:Integer; {определяет тип и задает режим работы графического драйвера}

     X,Y,xc,y:Integer;

     R:LongInt;

     Begin

     {Инициализация графического режима}

     Driver:=Detect;

     InitGraph(Driver,Mode,'C:\tp\BGI');

     SetColor(4); {красный цвет рисунка}

     SetBkColor(0); {черный цвет фона}

     xc:=500;{координата центра окружности по х}

     yc:=300; {координата центра окружности по y}

     Circle(xc,yc,100); {Окружность с заданным центром и радиусом}

     For  X:=400 to 600 do {перебираем  координаты точки по х }

     For  Y:=200 to 400  do{перебираем  координаты точки по у }

     If( sqr(x-xc ))+(sqr(y-yc))<99*99  then begin {ограничиваем область заполнения окружностью}

     PutPixel(x,y,random(16));{ процедура выставления точки с заданными координатами и цветом, который определяется функцией псевдослучайного числа в интервале от [0,16)}

     ReadLn; {задержка изображения на экране до нажатия enter}

     CloseGraph; {выход из графического режима в символьный}

     End.

  1. Алгоритм заполнения треугольника разными стилями:

     а)  Заполнение точками:

     Uses Graph; {подключение модуля Graph}

     Const {описание констант}

     z:array[1..4] of PointType= {с помощью массива задаем координаты треугольника}

     ((x:400;y:200),

     (x:600;y:400),

     (x:200;y:400),

     (x:400;y:200));

     Var Driver,Mode:Integer; {определяет тип и задает режим работы графического драйвера}

     X,Y,c:Integer;

     Begin

     {Инициализация  графического режима}

     Driver:=Detect;

     InitGraph(Driver,Mode,'C:\tp\BGI');

     SetColor(4); {красный цвет рисунка}

     SetBkColor(0); {черный цвет фона}

     DrawPoly(4,z);{рисуем треугольник с помощью ломаной линии, проходящей через данный массив точек}

     for x:=200 to 600 do begin{ перебираем  координаты точки по х }

     for y:=200 to 400 do begin{ перебираем  координаты точки по у }

     if (y>(1*(x-400)+300)) and (y>(1*(-x+1100)-400)) and (y<400)  then begin{ограничиваем область заполнения треугольником}

       if((x mod 5)<2)and ((y mod 10)<2) {задаем условие расстановки точек}

     then c:=4 else c:=0;

     PutPixel(x,y,c); {процедура выставления точки с заданными координатами и цветом}

       end;

     end;

     end;

     ReadLn; {задержка изображения на экране до нажатия enter}

     CloseGraph; {выход из графического режима в символьный}

     End.

     b)Заполнение прямыми линиями:

     Измененный фрагмент программы:

     if ((y) mod 10)<2 {задаем условие расстановки точек} 

     с)  Заполнение наклонными линиями:

     Измененный фрагмент программы:

     if((x+y) mod 10)<2  {задаем условие расстановки точек}

  1. Заполнение небольшими растровыми изображениями – окружностями:
Алгоритмы заполнения различных фигур определенным стилем