Краткие теоретические сведения.
1. Режимы работы монитора 1.1. Определения Текстовый режим [4] определяет вывод на экран, который разделен на ячейки (обычно 80 колонок на 25 строк), и может отображать только символы из кодового набора ПЭВМ. Каждая ячейка содержит атрибут и символ. Атрибут говорит о том, как выводится на экран символ (его цвет, мигание, интенсивность свечения). Текущая позиция на экране отмечается мерцающим прямоугольником – курсором. Позиция курсора X,Y (координаты точки) задаются номером колонки и номером строки символа или точки в зависимости от режима. Началом координат является левый верхний угол экрана (1,1), при этом X увеличивается слева направо, а Y – сверху вниз. Окно – прямоугольная область экрана (или весь экран), возможно окруженная рамкой и выделенная другим цветом или оттенком. Операции над окном производятся как над целым экраном. На экране одновременно могут находиться несколько окон, которые могут перекрывать друг друга. Окно, в котором находится курсор, называется текущим. Для кодирования цвета окон в предикатах Турбо-Пролога приняты следующие соглашения [2]:
Для получения яркого цвета к цвету изображения нужно добавить 8. Для получения атрибута окна нужно сложить цвет фона и изображения. Например, голубое изображение на белом фоне имеет атрибут: 112+1=113. Графический режим [4] определяет построение изображения на экране из точек (пикселов). Размер экрана измеряется количеством точек по горизонтали (X) и по вертикали (Y) и зависит от типа видеоадаптера. Число точек по осям X,Y называется разрешением экрана. Каждая точка может быть включена или выключена, а на цветных мониторах иметь еще и цвет. Таким образом изображение на экране строится включением и окраской точек.
Турбо Пролог 2.0 поддерживает следующие видеоадаптеры [1]:
В графическом режиме нет курсора. Вместо него используется указатель текущей позиции экрана CP, который может быть перемещен в любое место экрана, где должен строиться элемент изображения. При наличии видеоадаптера цветной графики (CGA, MCGA, VGA) можно установить цвет фона (экрана) и цвет изображения. Цвет фона и цвет изображения являются атрибутом окна и изображения. В процессе работы атрибут можно менять. Основными видеоадаптерами являются: CGA, EGA и VGA. Графика CGA. Графический адаптер CGA был первым цветным графическим адаптером на ПЭВМ фирмы IBM. CGA поддерживает один текстовый режим (25*80) и два отдельных графических режима: с высоким (640*200) инизким (320*200) разрешением экрана. При низком разрешении палитра (набор цветов) одновременно выводимых на экран цветов состоит из 4 цветов, один из которых является цветом фона. В режиме с высоким разрешением можно использовать только один цвет изображения на черном фоне. Графика EGA. EGA значительно расширяет графические возможности ПЭВМ. Как и CGA, видеоадаптер EGA может быть инициализирован для работы в двух режимах: низкого (640*200) и высокого (640*350) разрешения экрана. Оба эти режима позволяют выводить на экран одновременно палитру из 16 различных цветов. Главным различием между этими режимами является количество предоставляемых буферных страниц. В режиме низкого разрешения в памяти платы EGA может быть сохранено четыре полных страницы графического экрана. Это позволяет пользовательской программе создавать графическое изображение в трех различных экранах во время вывода на экран четвертого. Эти три дополнительных экрана дают возможность строить изображения на невидимых экранах, затем быстро переходить от одного графического экрана к другому не ожидая, пока будет нарисовано новое изображение.
В режиме высокого разрешения EGA доступны две страницы: одна невидимая и одна выведенная на экран. Графика VGA. Имеется совместимость с EGA и CGA. Максимальная палитра 256 цветов. Разрешение 640*480. Окна в графическом режиме. Как и окна текстового режима, окно в графическом режиме, именуемое в дальнейшем VP (viewport), используются для выбора конкретной части экрана для построения в нем изображения. По умолчанию VP после инициализации занимает весь экран. В отличие от окон текстового режима VP не буферизируются. Это означает, что при перекрытии окон, информация в первом из них будет потеряна. При записи предикатов в общем виде в строке комментарий указывается тип аргумента и вид передачи аргументов (текущий шаблон), т.е. какие аргументы являются входными (i), а какие выходными (о). Некоторые предикаты могут иметь несколько различных текущих шаблонов в зависимости от того, получают они связанные или несвязанные переменные. 1.2. Работа с окнами Основным предикатом для создания окон является предикат для определения окна: – makewindow(Ном_Окна, Атр_экрана, Атр_рамки, Заголовок, Строка, Столбец, Высота, Ширина,), где Ном_Окна – логический номер, присваиваемый окну для ссылок в других предикатах. Номера 80-85 использовать не рекомендуется, так как они зарезервированы за пакетом TOOLBOX (см. раздел 3.); Атр_экрана – атрибут цвета для внутренней области окна; Атр_рамки – атрибут цвета для внешней области окна (рамки), 0 – если рамка отсутствует; Заголовок – текст, помещаемый на верхней рамке окна; Строка – номер строки верхнего левого угла окна; Столбец – номер колонки верхнего левого угла окна; Высота – высота окна в строках; Ширина – ширина окна в колонках.
Например: makewindow(1,7,135,"Пример окна",5,15,6,10) Параметры должны соответствовать характеристикам аппаратуры, иначе выдается сообщение об ошибке. Созданное окно становится текущим окном. Экран может быть разбит на несколько окон. Для перехода их одного окна в другое служит предикат – shiftwindow(Ном_Окна): прототип (i) – активизирует окно с заданным номером; прототип (o) – связывает с параметром номер текущего окна. Например: shiftwindow(3) – активизируется окно с номером 3; shiftwindow(Х) – результат: Х=1, если текущее окно имеет номер 1. При переходе в другое окно координаты являются локальными т.е. отсчет идет от левого верхнего угла, которое имеет координаты (0,0). – clearwindow – стирает содержимое текущего окна (очищает окно), при этом курсор перемещается в позицию (0,0); – removewindow – удаляет текущее окно, если окна не существует, выдается ошибка времени выполнения. Управление курсором осуществляется с помощью предиката – cursor(Строка, Столбец): прототип (i,i) – передвигает курсор в текущем окне в позицию, заданную номерами строки и столбца. Номер строки может находится в диапазоне от 0 до 24, номер столбца – от 0 до 79. координаты левого верхнего угла экрана – (0,0); прототип (o,o) – связывает номера строки и столбца, определяющие позицию курсора, с соответствующими параметрами. Например: cursor(5,10) – курсор устанавливается на пятой строке в десятом столбце; cursor(Z,S) – результат: Z=12, S=40, если курсор установлен на строке 12 в столбце 40. – existwindow(Ном_Окна) – проверяет наличие окна с заданным логическим номером; – setcolor(Окно_или_рамка) – позволяет пользователю интерактивно изменять цвет окна (0) или рамки (1). При этом появляется меню, аналогичное подменю Setup/Colors в интегрированной оболочке Турбо Пролога. – attribute(Атрибут): прототип (i) – устанавливает значение атрибута, определяющее цвет фона текущего окна. Значение атрибута определяется параметром (см. табл.); прототип (o) – опрашивает атрибут текущего окна и связвает его с параметром. Например: attribute(88) – устанавливает розовый цвет текущего окна; attribute(Х) – если фон окна голубой, то значением переменной Х будет число 24.
– scrol (Число_строк, Число_столбцов): прототип (i,i) – сдвигает содержимое текущего окна на заданное число строк и столбцов. Положительные значения аргументов задают скроллинг вниз и вправо, а отрицательные - вверх и влево. Пример программы для работы с окнами: predicates nondeterm repeat goal makewindow(1, 1, 7, "one", 5, 0, 10, 20), write("ONE"), makewindow(8, 8, 7, "eight", 1, 10, 10, 20), write("EIGHT"), makewindow(9, 9, 7, "nine", 15, 20, 10, 20), write("NINE"), repeat, random(9,X), N=X+1, shiftwindow(9), shiftwindow(1), keypressed. clauses repeat. repeat:- repeat. 2. Универсальный графический интерфейс (УГИ) УГИ – это свыше 70 встроенных предикатов для работы с графикой. Эти предикаты позволяют работать как с отдельной точкой, так и с объектами типа линий, дуг, окружностей, многоугольников и др. УГИ поддерживает различные виды штриховки линий, закраску поверхностей, различные виды шрифтов (фонты) и драйверы практически всех распространенных графических адаптеров ПЭВМ. Полный список предикатов УГИ можно получить в процессе работы нажав клавишу F1. Они находятся в текстовом файле PROLOG.HLP. Чтобы применять УГИ необходимо иметь видеографический адаптер, поддерживаемый УГИ (например, нельзя применять на ЕС 1840). 2.1. Установка графического режима Режим работы графического экрана устанавливается предикатом initgraph, который инициализирует графическую систему, загружая с диска соответствующий драйвер графического видеоустройства (см. файлы с расширением BGI) переводя его в графический режим работы. Предикат initgraph() имеет пять аргументов. Он связывает переменные NewDriver и NewMode с реальным драйвером и режимом работы, а также устанавливает значения по умолчанию всем графическим переменным (текущая позиция, цвет, палитра и т.д. в зависимости от видеоадаптера). – initgraph(Graphdriver,Graphmode,NewDriver,NewMode,Pathtodriver) (integer,integer,integer,integer,string): прототип (i,i,o,o,i), где Graphdriver – целое число, которое задает номер используемого драйвера, 0 означает, что система должна сама определить тип используемого в ПЭВМ видеоконтроллера и вернуть номер соответствующего ему драйвера (1 – CGA, 2 – MCGA, 3 – EGA,..., 9 – VGA). См. также декларации в файле GRAPDECL.PRO; Graphmode – графический режим. Символические константы для объявления режима определены в файле GRAPDECL.PRO. Pathtodriver – путь к директории, где находится драйверы (*.BGI), пустая строка " " означает текущую директорию. Например: constants bgi_path = " " goal InitGraph(G_Driver,G_Mode, _, _, bgi_Path) После инициализации экрана он очищается и СР устанавливается равным координатам верхнего левого угла экрана (0,0). Иногда, если предполагается, что программа будет выполняться на различных ПЭВМ, более удобно перед выполнением предиката initgraph() выполнить предикат:
– detectgraph(Graphdriver,Graphmode) (integer,integer): прототип (o,o) – проверяет какой графический адаптер используется в системе и определяет режим его работы при наибольшем разрешении. Если графический адаптер не обнаружен, то возвращается – 2. Например: DetectGraph(G_Driver, G_Mode1), Чтобы освободить память, занятую под графику, и вернуть экран в режим, используемый до initgraph, в конце работы нужно выполнить предикат: closegraph(). 2.2. Перемещение по экрану Так как характеристики видеотерминалов значительно отличаются, то с помощью следующих предикатов рекомендуется получить максимальные значения X и Y: getmaxХ(X) и getmaxY(Y). Для перемещения по плоскости изображения используются предикаты: – getx(X) – получить текущую координату X; – gety(Y) – получить текущую координату Y; – moveto(X,Y) – переместить текущий указатель в точку X,Y; – moverel(DeltaX,DeltaY) – переместить текущий указатель на DeltaX пикселов по горизонтали и на DeltaY пикселов по вертикали. Предикат cleardevice не имеет аргументов. Он очищает графический экран перемещает указатель текущей позиции в точку (0,0). 2.3. Установка/изменение текущих значений Предикаты установки значений: – setlinestyle((Вид_Линии, Шаблон, Толщина) (integer,integer,integer): прототип (i,i,i) – устанавливает вид линии по умолчанию, используемый другими предикатами УГИ. Параметры: "Вид_Линии" – сплошная (0), из точек (1), центрированная (2), пунктирная(3), задаваемая пользователем (4); "Шаблон" – 16-битовый шаблон задающий вид линии (только для "Вида_Линии"=4, иначе шаблон игнорируется): сплошная линия $FFFF, пунктирная $3333; "Толщина" – нормальная линия или утолщенная. – setfillpattern(Список_шаблона, Цвет) (bgi_list,integer): прототип (i,i) – устанавливает определяемый пользователем шаблон – заполнитель. Шаблон в виде матрицы 8 на 8 бит кодируется в виде списка из 8 однобайтовых элементов, каждый из которых кодирует 8 бит. Если бит шаблона равен 1, то соответствующий ему пиксел будет выведен на экран. – setfillstyle(Шаблон, Индекс_Цвета) (integer,integer): прототип (i,i) – устанавливает в качестве текущего заполнителя один из определенных в системе шаблонов, а текущий цвет заполнителя равным "Индекс_Цвета" в палитре. Константы для "Шаблона" приведены в файле GRAPDECL.PRO – setpalette(Индекс, Реальный_Цвет) (integer,integer): прототип (i,i) – изменяет один цвет палитры, расположенный в ней под номером "Индекс", на цвет заданный параметром "Реальный_Цвет". Последний представляет собой зависящий от аппаратуры номер цвета для используемого драйвера. Индекс должен находится в диапазоне от 0 до <количество_цветов_в_текущей_палитре>. Для адаптера CGA можно изменять цвет только с индексом 0 (цвет фона). Файл GRAPDECL.PRO содержит определения констант для наиболее часто применяемых цветов. – setallpalette(Список_Цветов) (bgi_ilist): прототип (i) – изменяет все цвета палитры в соответствии со "Списком_Цветов" (адаптеры EGA/VGA). Текущий цвет фона и цвет изображения (из текущей палитры) можно получить/установить с помощью предикатов: – getbkcolor(BkColor) (integer): прототип (о) – возвращает цвет фона; – getcolor(Color) (integer): прототип (о) – возвращает цвет изображения; – setbkcolor(Color) (integer): прототип (i) – установить цвет фона; – setcolor(Color) (integer): прототип (i) – установить цвет изображения. Следующие два предиката позволяют получить/изменить цвет заданной точки: – getpixel(X,Y,Цвет) (integer,integer,integer): прототип (i,i,o); – putpixel(X,Y,Цвет_Точки) (integer,integer,integer): прототип (i,i,i); где (X,Y) - координаты точки (пиксела). 2.4. Построение графических объектов В следующих предикатах углы отсчитываются против часовой стрелки, 0 градусов соответствует трем часам. – arc(X,Y,StartAngle,EndAngle,R) (integer,integer,integer,integer,integer): прототип (i,i,i,i,i) – pисует текущим цветом дугу окpужности с центpом (X,Y) и pадиусом R, начинающуюся с ²StartAngl² и заканчивающуюся на ²EndAngl²; – ellipse(X, Y, StAngle, EndAngle, Xradius, YRadius) (все аргументы целочисленные): прототип (i,i,i,i,i,i) – pисует эллипс; – pieslice(X,Y,Нач_Угол, Кон_Угол, Радиус) (все аргументы целочисленные): прототип (i,i,i,i,i) – рисует и заполняет сектор круга от ²Нач_Угол² до ²Кон_Угол² с центром в (X,Y) и заданным радиусом. Граница сектора выделяется текущим цветом изображения, а заполнение производится текущим шаблоном и цветом заполнителя; – pieslicexy(X,Y,Нач_Угол, Кон_Угол, X_Радиус, Y_Радиус) (все аргументы целочисленные): прототип (i,i,i,i,i,i) – рисует и заполняет сектор эллипса с центром (X,Y), горизонтальным радиусом ²Х_Радиус², вертикальным – ²Y_Радиус², от ²Нач_Угол ²до ²Кон_Угол². Остальное как для pieslice; – line(X0,Y0,X1,Y1) (все аргументы целочисленные): прототип (i,i,i,i) – рисует текущим цветом, стилем линии и толщиной прямую линию между двумя заданными точками: (X0,Y0) – начало; (X1,Y1) – конец. Предикат line не обновляет текущую позицию и всегда вычисляется; – linerel(DeltaX,DeltaY) (integer,integer): прототип (i,i) – рисует линию от текущей позиции до точки приращения координат до которой равны (DeltaX, DeltaY). Текушая позиция изменяется на (DeltaX, DeltaY); – lineto(X,Y) (integer,integer): прототип (i,i) – рисует линию от текущей позиции до точки с координатами (X,Y), после чего текущая позиция перемещается в (X,Y); – rectangle(X, Y, X1, Y1) (все аргументы целочисленные): прототип (i,i,i,i) –рисует текущим цветом и стилем линии прямоугольник по координатам его верхнего левого (X,Y) и нижнего правого (X1,Y1) углов; – drawpoly(PolyPointsList) (point_list): прототип (i) – рисует многоугольник, где (point_list) – список координат вершин X,Y. Например: drawpoly([45,15, 85,45, 45,85, 15,45]). – circle(X,Y,Radius) (integer,integer,integer): прототип (i,i,i) – рисует окружность. При построении окружности учитывается отношение масштабов по горизонтали и по вертикали. – getaspectratio(Xasp,Yasp) (integer,integer): прототип (i,i) – вычисляет коэффициенты искажения по горизонтали Xasp и по вертикали Yasp; прототип (o,o) – устанавливает новые коэффициенты; – bar(Left,Top,Right,Bottom) (все аргументы целочисленные): прототип (i,i,i,i) – рисует заполненную текущим шаблоном прямоугольную полосу; – bar3d(Left,Top,Right,Bottom,Depth,Topflag) (все аргументы целочисленные): прототип (i,i,i,i,i,i) – рисует заполненную текущим шаблоном трехмерную прямоугольную полосу; – outtext(СтрокаТекста) (string): прототип (i) – выводит строку текста в окно вывода (viewport) используя текущий шрифт, размер, направление и установки выравнивания; – outtextxy(X,Y, СтрокаТекста) (integer, integer, string): прототип (i,i,i) – выводит с заданной позиции (X,Y) строку текста в окно вывода используя текущий шрифт, размер, направление и установки выравнивания; – getimage(Left,Top,Right,Bottom,BitMap) (все аргументы целочисленные): прототип (i,i,i,i,o) – сохраняет в памяти прямоугольную область экрана в переменной BitMap, которой потом уже нельзя манипулировать как другими переменными – она используется в предикате putimage для вывода сохраненного изображения на экран, при этом координаты X,Y задают местоположение верхнего левого края области. Количество байтов требуемое для сохранения изображения может быть получено с помощью предиката imagesize. – imagesize(Левый, Верхний, Правый, Нижний, Size) (integer,integer,integer,integer,string): прототип (i,i,i,i,o) возвращает в Size колическво байтов, необходимых getimage для сохранения изображения. Сохраняемое изображение – это прямоугольник, задаваемый координатами "Левого Верхнего" и "Правого Нижнего" углов. Если для сохранения изображения требуется память больше 64К, то возвращается $FFFF. – putimage(X,Y,Bitmap, BitOp) (integer,integer,string,integer): прототип (i,i,i,i) помещает изображение, сохраненное с помощью getimage, обратно на экран, при этом (X,Y) являются координатами верхнего левого угла изображения. Аргумент BitOp задает каким образом по цвету существующего пиксела и цвету пиксела выводимого изображения вычисляется цвет каждой результирующей точки на экране: 0 - копируются цвет изображения 1 - выполняется логическое OR (исключающее ИЛИ) 2 - выполняется логическое OR (ИЛИ) 3 - выполняется логическое AND (И) 4 - копируется инверсное изображение.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|