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

 

 

Представление графической информации в компьютере

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

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

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

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

Информация в видеопамяти (видеоинформация) представляет собой совокупность кодов цвета каждого пикселя экрана. Отсюда следует, что вопрос о представлении изображения связан со спо­собами кодирования цветов. Физический принцип получения раз­нообразных цветов на экране дисплея заключается в смешивании трех основных цветов: красного, зеленого и синего. Значит ин­формация, заключенная в коде пикселя должна содержать сведения о том, какую интенсивность (яркость) имеет каждая составляющая в его цвете.

Например, в 8-цветной палитре используется трёхбитовый код и каждый бит такого кода обозначает наличие (1) или отсутствие (0) соответствующего базового цвета. Биты в таком коде распределены по принципу «КЗС» (красный-зелёный-синий).

Палитры большего размера получаются путем раздельного уп­равления интенсивностью каждого из трех базовых цветов. Для этого в коде цвета под каждый базовый цвет выделяется более одного бита. Например, структура восьмибитового кода для палитры из 256 цветов такая: «КККЗЗЗСС», т.е. по 3 бита кодируют красную и зеленую составляющие и 2 бита – синюю.

Связь между разрядностью кода цвета b и количеством цветов K (размером палитры) выражается формулой: K = 2b. Величину b принято называть битовой глубиной цвета.

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

Положение и форма графических примитивов задаются в системе графических координат, связанных с экраном. Обычно начало координат расположено в верхнем левом углу экрана. Сетка пикселей совпадает с координатной сеткой. Горизонтальная ось Х направлена слева направо; вертикальная ось У - сверху вниз.

Векторный формат изображения создается в результате исполь­зования графических редакторов векторного типа, например CorelDraw. Получаемая таким образом информация сохраняется в графических файлах векторного типа. Графические файлы растровых типов получаются при работе с растровыми графическими редакторами (Paint, Adobe Photoshop), а также в результате скани­рования изображений.

 

Структурный подход в алгоритмизации

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

Следование – самая важная из структур. Следование означает, что действия могут быть выполнены друг за другом.

Ветвление – это структура, обеспечивающая выбор между двумя альтернативами. Выполняется проверка, а затем выбирается один из путей. Эта структура называется также «развилка» или «если-то-иначе». Каждый из путей (ТО или ИНАЧЕ) ведёт к общей точке слияния, так что выполнение программы продолжается независимо от того, какой путь был выбран.

Может оказаться, что для одного из результатов проверки ничего предпринимать не надо. В этом случае можно применять только один блок (в этом случае используется так называемое «неполное ветвление»).

 

Полное ветвление

Неполное ветвление

 

Цикл (или повторение) предусматривает повторное выполнение некоторого набора команд программы. Циклы позволяют записать длинные последовательности операций обработки данных с помощью небольшого числа повторяющихся команд.

Существуют два типа циклов – цикл с предусловием (ПОКА) и цикл с постусловием (ДО).

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

Исполнение цикла ДО начинается с выполнения действия. Таким образом, тело цикла будет реализовано хотя бы один раз. После этого происходит проверка условия. Если условие не выполняется, то происходит возврат к выполнению действий. Если условие истинно, то осуществляется выход из цикла. Таким образом, условие цикла ДО – это условие выхода. Для предотвращения зацикливания необходимо предусмотреть действия, приводящие к истинности условия

 

Цикл с предусловием (ПОКА)

 

Цикл с постусловием (ДО)

 

Цикл со счётчиком

 

Существует ещё и третий тип цикла – цикл с параметром (цикл со счетчиком, арифметический цикл) – это цикл с заранее известным числом повторов. Этот цикл выполняется столько раз, сколько различных значений может принимать параметр. Значение параметра изменяется от некоторого фиксированного начального значения до некоторого фиксированного конечного значения с некоторым заранее указанным постоянным шагом. Если начальное значение параметра больше конечного, то шаг – число отрицательное. Выход из цикла происходит при достижении параметром своего конечного значения. (Этот цикл не входит в основные структуры, т.к. реализован не во всех языках программирования).

Ещё одним важным компонентом структурного подхода к разработке алгоритмов является модульность. Модуль – это последовательность логически связанных операций, оформленных как отдельная часть программы. Использование модулей имеет следующие преимущества:

1.      Возможность создания программы несколькими программистами.

2.      Простота проектирования и последующих модификаций программы.

3.      Упрощение отладки программы.

4.      Возможность использования готовых библиотек наиболее употребительных модулей.

Но самым важным достижением структурного подхода является нисходящее проектирование программ, основанное на идее уровней абстракции, которые становятся уровнями модулей в разрабатываемой программе. На этапе проектирования строится схема иерархии, изображающая эти уровни. Схема иерархии позволяет программисту сначала сконцентрировать внимание на определении того, что надо сделать в программе, а лишь затем решать, как это надо делать. При нисходящем проектировании исходная, подлежащая решению задача разбивается на ряд подзадач, подчинённых по своему содержанию главной задаче. Такое разбиение называется детализацией или декомпозицией. На следующем этапе эти задачи, в свою очередь, разбиваются на более мелкие подзадачи и так далее, до уровня относительно простых подзадач.

 

Программирование графики в Паскале

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

Итак, для работы с графическими средствами необходимо выполнить следующие действия.

1) Подключить модуль GRAPH (с помощью оператора uses).

2) Необходимо установить один из возможных графических режимов.

Для этого предназначена процедура InitGraph.

Procedure InitGraph (var GraphDriver: integer; var GraphMode: integer; DriverPath: string);

Параметр GraphDriver задает драйвер (его код или имя),

параметр GraphMode задает режим работы адаптера),

параметр DriverPath - строка, содержащая путь к драйверу (если строка пустая, считается, что драйвер находится в текущем каталоге).

Процедура InitGraph

§         определяет графическое аппаратное обеспечение,

§         загружает и инициализирует соответствующий графический драйвер,

§         переводит систему в графический режим

§         и передает управление вызванной программе.

Пример    uses graph;

              var GraphDriver, GraphMode: integer;

              GraphDriver:= VGA; {или GraphDriver:=9}

              GraphMode:=VGALo; InitGraph(GraphDriver,GraphMode,'c:\BP\BGI');

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

Если выполнить оператор GraphDriver:=Detect; (в этом случае GraphMode уже ничего не требуется присваивать), система переходит в режим автоопределения. Если вообще возможно переключение системы в графический режим, то процедура InitGraph автоматически инициализирует соответствующий драйвер и включает режим с максимальным разрешением для данного типа видеоадаптера. При этом в переменные GraphDriver, GraphMode процедура возвратит автоматически определенные значения этих параметров или код ошибки.

 

Пример    uses graph; var GraphDriver, GraphMode:integer; GraphDriver:=Detect;               InitGraph(GraphDriver,GraphMode,''); {драйверы в текущем каталоге}

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

 

3) Далее следуют операторы-вызовы процедур и функций модуля Graph.

4) Освободить память от драйвера и восстановить предыдущий видеорежим (текстовый).

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

 

Перечислим еще несколько полезных функций модуля Graph.

Внутренние ошибки в модуле Graph возвращаются функцией GraphResult.

Используется для того, чтобы узнать о состоянии последней графической операции. Если ошибка не произошла, результатом является 0.

Функция  

function GetDriverName : string

возвращает строку, содержащую имя текущего драйвера.

Функция  

function GetGraphMode : integer

возвращает номер текущего графического режима, который установлен InitGraph.

Функция  

function GetModeName(ModeNumber : integer) : string

где ModeNumber - номер графического режима,

возвращает строку, содержащую имя заданного графического режима.

 

Построение линий и фигур с помощью модуля Graph

В графическом режиме весь экран разбивается на пиксели. Каждый пиксель имеет две координаты: X по горизонтали, Y по вертикали. Левый верхний пиксель имеет координаты (0,0). Правый нижний - в зависимости от типа адаптера и режима его работы. В отличие от текстового режима в графическом режиме курсор, определяющий место на экране, является невидимым, однако его можно перемещать в любую точку экрана, можно посмотреть значения координат курсора.

1) Procedure MoveTo (x, y : integer)              (Аналог gotoxy текстовом режиме)

Перемещает текущий указатель координат в точку (x, y).

!!! Точка на экране не высвечивается.

2) Function GetX : integer

Возвращает координату x текущей позиции на экране относительно текущего окна.

3) Function GetY : integer

Возвращает координату y текущей позиции на экране относительно текущего окна.

4) Function GetMaxX : integer

Возвращает максимальную координату x для текущего драйвера в текущем режиме.

5) Function GetMaxY : integer

Возвращает максимальную координату y для текущего драйвера в текущем режиме.

6) Procedure ClearDevice очищает экран, закрашивает его в цвет фона и устанавливает графический указатель в точку с координатами (0,0).

7) Procedure PutPixel (x, y : integer; Color : word) – выводит на экран точку (x,y) данного цвета.

8) Procedure SetBkColor (Color : word)  устанавливает цвет фона экрана.

9) Procedure SetColor (Color : word)  устанавливает текущий цвет, которым будут изображаться контуры фигур и тексты.

10) Procedure LineTo (x, y :integer) вычерчивание прямой линии из точки, в которой находится текущий указатель в точку с координатами (x, y).

11) Procedure Line (x1, y1, x2, y2 : integer) проводит линию текущего цвета из точки (x1, y1) в точку (x2, y2). Значение текущего указателя не меняется.

12) Procedure SetLineStyle(LineStyle : word; Patten : word; Thickness : word)

Она задает текущие параметры линии: стиль, шаблон и толщину.

LineStyle - стиль линии (0 – обычная, 1 – пунктирная, 2 – штрихпунктирная, 3 – штриховая, 4 - задает пользователь), Patten - шаблон линии (только при  LineStyle = 4), Thickness – толщина (от 1 до 3).

Пример. Жирная штриховая линия

            SetColor(3); SetLineStyle(3,3); {третий параметр можно опускать}

     Line(1,1,600,1);

13) Procedure Bar (x1, y1, x2, y2 : integer) строит прямоугольник, где точка (x1, y1) - левая верхняя вершина, точка (x2, y2) - правая нижняя. Прямоугольник закрашивается текущим орнаментом или цветом заполнения.

14) Procedure SetFillStyle (Patten : word; Color : word) задаёт орнамент и цвет заполнения фигур, здесь Color - цвет, Patten – параметры заполнения:  0 - цветом фона, и т.д. разные цифры от 0 до 12 и дальше соответствуют разным заполнениям.

15) Procedure Circle (x, y : integer; radius : word) строит окружность текущим цветом и текущими параметрами линии (x, y - центр окружности)

16) Procedure Bar3D ((x1, y1, x2, y2 : integer; Depth : word; Top : boolean) строит параллелепипед, у которого закрашена передняя грань текущим орнаментом и цветом заполнения, (x1, y1, x2, y2) - координаты левого верхнего и правого нижнего угла передней грани; Depth - ширина боковой грани, отсчитанная по горизонтали; Top - признак включения верхней грани (true - грань вычерчивается, false - нет); кроме того, определены константы TopOn = True; TopOff = False.

Пример. Нарисуем столбик с верхней гранью.

Bar3D (80, 100, 120, 180, 15, TopOn)

17) Procedure OutText (text : string) - пересылает значение text на устройство вывода, начиная с точки расположения графического указателя.

18) Procedure OutTextXY (x, y :integer; text : string) - выводит текст, начиная с точки (x, y). Если строка слишком длинная и выходит за пределы экрана или текущей области просмотра, то она усекается.

19) Procedure SetTextStyle (Font:word; Direction :word; CharSize :word) - масштабирование и выбор шрифта (Font - тип шрифта: 0 – нормальный, 1 – полужирный, 2 – тонкий, 3 – рубленый, 4 - готический; Direction – направление: 0 = HorizDir горизонтальное, 1 = VertDir – снизу верх; CharSize – размер символов (1 – нормальный, 2 – увеличивается в 2 раза, 3 – в 3 раза и т.д.).

20) Procedure FloodFill(x,y,color) закрашивает фигуру до границы с заданным цветом, x,y – любая внутренняя точка фигуры.

 

Пример полностью написанной программы рисования звёздного неба (с комментариями):

program sky; {см. приложенный файл INF_1_14.pas}

uses crt,graph; {подключение модулей}

var x,y,z,k,gd,gm:integer; path:string; {описание переменных}

begin gd:=VGA; {выбор графического адаптера} gm:=2; {выбор графического режима}

path:='c:\bp\bgi'; {путь к граф.драйверам, сам Pascal установлен в C:\BP\}

initgraph(gd,gm,path); {включение граф.режима}

randomize; {включение функции random}

for k:=1 to 400 do {количество звезд} begin

    x:=random(640); {координата X} y:=random(480); {координата Y}

    z:=random(15)+1; {цвет звезды определяется числом от 1 до 15}

    putpixel(x,y,z); {рисование звезды-точки}

    delay(1200); {задержка появления звезды, в милисекундах} end;

setfillstyle(1,14); {выбор стиля и цвета заполнения луны-окружности}

setcolor(14); {выбор цвета рисования луны-окружности}

circle(550,80,30); {рисование луны-окружности}

floodfill(550,80,14); {закрасить окружность до её границ}

repeat until keypressed; {ждать, пока не нажмут любую клавишу}

closegraph; {закрыть графический режим} end. {конец программы}

Hosted by uCoz