Графика в Turbo Prolog’е
Графика в Турбо Прологе позволяет создавать окна различного цвета, определять цвет текста и фона, переключать ввод и вывод из одного окна в другое, рисовать рисунки. Для работы с окнами, которые могут быть созданы как в текстовом, так и в графическом режиме имеются встроенные предикаты:
Makewindow (сделать окно) – открыть окно,
Shiftwindow (переключиться. на окно) – сменить окно,
Gotowindow (переключиться. на окно) – выбор окна,
Removewindow (удалить)
Clearwindow (очистить)
Окно создается предикатом Makewindow (номер окна, атрибуты экрана, атрибут рамки, строка рамки, начальная строка, начальный столбец, высота окна, ширина окна). Первый аргумент используется при активизации окна и перехода между окнами, а второй определяет цвет символов и фона в зависимости от типа монитора, указанное число получается сложением номера цвета текста с номером текста фона.
Цвет текста:
0 – черный 8 – серый
1 – синий 9 – светло-синий
2 – зеленый 10 – светло-зеленый
3 – голубой 11 – светло-голубой
4 – красный 12 – светло-красный
5 – фиолетовый 13 – светло-фиолетовый
6 – коричневый 14 - желтый
7 – белый 15 – интенсивно-белый
Цвет фона:
0 – черный
16 – синий
32 – голубой
48 – зеленый
64 – красный
80 – фиолетовый
96 – коричневый
112 – белый
Третий аргумент определяет цвет рамки:
0 – нет рамки
1- синий
2 3 4 5 6 7 – такие же, как и цвет текста
8 – коричневый
-1 – мерцающее белое
-2 – мерцающее желтое
-3 – мерцающее фиолетовое
-4 – мерцающее красное
Четвертый аргумент определяет имя окна, т.е. текст в середине заголовка окна.
Пятый и шестой аргументы – максимальная верхняя строка (максимально 24) и крайний слева столбец (максимально-79).
Седьмой аргумент – число строк в окне ( максимум 25).
Восьмой аргумент – число столбцов в окне (максимум 80).
Примеры:
- Makewindow (1,7,7, «Fullscreen», 0,0,25,80) весь экран
- Makewindow (2, 4, 1, «меню», 4, 20, 16, 40)
Shiftwindow ( номер) – сделать активным окно номера N
Gotowindow (N окна) – переключение между неперекрывающимися окнами
Clearwindow – очистка текущего окна
Removewindow – удаление текущего окна
Стандартные операторы ввода, вывода read, readint, readchar, write работают с текущим окном. Для позиционирования вывода используется оператор Cursor (N строки, N столбца), при этом номера определяются относительно верхней строки и левого столбца.
Для приостановки работы программы и ожидания ввода с клавиатуры используется оператор readchar(_).
Задания для самостоятельной работы.
- Создать окно с белыми символами на черном фоне.
- Вывести текст в окно.
- Удалить текст из окна.
- Удалить окно.
7.11.1 Создание меню
Необходимость в меню возникает при выборе одной задачи из нескольких, либо при определении порядка выполнения задач. После выбора может выполняться задача или вызываться дочернее меню.
Предикат repeat в программе используется для возврата в главное меню по окончании выполнения подмодуля, за исключением случая 0. Предикат readint (X) считывает целое и присваивает его X. Если Х>5 правило X<5 выполняется неуспешно и произойдет откат, иначе выполняется попытка выполнить правило process(X). Если Х=0 , то отсечение ! препятствует откату к правилу repeat и программа заканчивается.
predicates
repeat
process(integer)
show_menu
run_file_utility
goal
run_file_utility.
clauses
run_file_utility:-
show_menu,nl,
write(“Press space”),
read_char(_),exit.
repeat.
repeat:-repeat.
show_menu:-repeat, makewindow(1, 7, 7, ”Main Menu”, 4, 10, 16, 36), nl,
write(“Menu Utility”), nl, nl,
write(“0 Exit”), nl,
write(“1 Delete”), nl,
write(“2 Rename”), nl,
write(“3 Create”), nl,
write(“4 Exit”), nl, nl,
write(“Please enter choice(0-4)”),
readint(X), X<5,process(X), X=0,!.
process(0):-nl, write(“Bye”), nl.
process(1):-makewindow(2, 7, 7, ”File Deletion”, 12, 36, 10, 36),
write(“Delete”), nl, write(“Space”), readchar(_), removewindow.
Аналогично пишутся остальные окна.7.11.2. Создание графического режима
Для создания графики имеется пять режимов. Наиболее подходит пятый режим
N=1-5 – EGA, экран 640*350, 13 цветов, 80 столбцов
4 - 640*200, 16 цветов
Переход в графический режим осуществляется: graphics (режим, палитра, цвет). При выполнении этого оператора экран очищается. Для возврата в текстовый режим используется предикат text. Палитра и цвет определяют цвет точки или линии на экране по следующей таблице:
Цвет/палитра
1
2
3
0
зеленый
красный
желтый
1
голубой
фиолетовый
белый
Соотношение цветов в графическом режиме определяется сложным образом.
Для рисования рисунков используется всего 2 встроенных предиката:
Координаты экрана изменяются в интервале: 0 – 31999
- dot (строка, столбец, цвет палитры) – рисует точку и употребляется редко
- line (строка1, столбец1, строка2, столбец2, цвет) – рисует линию между соответствующими точками
для построения окружности используется формула окружности
строка = центральная строка – R*cos(A)
столбец = центральный столбец + R*sin(A)
При шаге A на 0,02 радиус окружность будет содержать 314 точек
row=центр.стр-1.40*R*cos(A)
predicates
draw_ellipse(real)
real_int(real,integer)
make_windows
draw_figures
goal
draw_figures.
clauses
draw_figures:-
make_window, draw_ellipse(0.02),
write(“press space”),
readchar(_), exit.
make_window:-graphics(2, 0, 7),
makewindow(1, 7, 7, ”Figures”, 1, 10, 23, 60).
draw_ellipse(A):-A>=6.28, !.
draw_ellipse(A):-
center_row=20000,Center_col=5000,
R=3600, Row_r=Cemter_row-R*cos(A),
Column_r=Cemter_Col+R*sin(A),
real_int(Row_r,Row), real_int(Column_r,Column),
dot(Row,Column,1), A1=A+0.02, draw_ellipse(A1).
real_int(R,I):-R=I.7.11.3. Черепашья графика
Все координаты в черепашьей графике отчитываются от предыдущего положения курсора. Определить следующие предикаты:
Penup – поднять перо
Pendown – опустить перо
Pencolor (A) – установить цвет, А – номер цвета
Forward (B) – перемещение черепашки вперед по прямой линии
Back (B) – перемещение ее назад, В –число шагов на расстоянии В, В меняется от 1 до 31999.
Right(A) – поворот по часовой стрелке
Left (A) –поворот против часовой стрелки на угол А
Penpos (строка, столбец, угол) – этот оператор помещает черепаху в соответствующие строку и столбца, с ориентацией на угол А.
А=0 соответствует ориентации вниз.
Пример 1. Нарисовать вертикальную линию, длина – 8000 с точки(1000, 1600)
draw_en:-
penpos (1000, 1600, 0) , pendown, pencolor(1),
forword (8000),
Пример 2. Нарисовать замкнутую фигуру с точки (20000, 16000) из прямых отрезков длиной 1000 путем вращения на 20 при каждом шаге.
draw_Fig:-
graphics(2, 0, 7), penpos (20000, 16000, 0),
pendown, closed_fig (500).
closed_fig (A):-A>=30000,!.
closed_fig (A0):-
forward (1000),
right (2),
A=A0+50, closed_fig (A).