Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > Форум Форум программистов > Форум Prolog
Восстановить пароль Регистрация

Закрытая тема Создать новую тему
 
22.05.2010, 20:42   #1
rrrFer
Заблокирован
Рисование в Турбо Пролог / Prolog

Надоели темы студентов с просьбой нарисовать что-либо в Турбо-Прологе.
литература:
1. Д.Соломон "Использование Турбо-Пролога"
2. Н. Ярушина "Программирование на языке Турбо-пролог 2.0."
есть 3 режима при работе с графикой: BGI-Графика, старая графика и черепашья.
старая графика инициализируется предикатом graphics и позволяет вывести линию или точку, описана с примерами в [1], вобщем любые фигуры рисуеются из точек и линий.
черепашья графика позволяет опустить перо, поднять перо, сдвинуть перо, изменить цвет пера, повернуть перо. Вобщем тоже можно нарисовать что угодно, но ИМХО еще больше мучений чем в предыдущем случае. Описана в [1].
при использовании BGI графики доступно большее количество возможностей, в том числе большое количество графических примитивов(дуги, окружности, ломаные линии и т.д.). что такое BGI.
Для использования BGI нужно иметь соответсвующую библиотеку и драйверы.
Ниже код программы, выводящей 5 квадратиков по диагонали:
Код Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
constants
    bgi_path = "BGI"
predicates
    makeViewPort(integer,integer)
    Draw(integer,integer,integer)   
goal
    initGraph(0, 0, New_Driver, New_Mode, bgi_path),
    makeViewPort(Mx,My),
    N=5,Sy=My div N,
    Draw(Sy,5,0),    
    closegraph().
clauses              
    makeViewPort(MaxX,MaxY):-
        getMaxX(MaxX),getMaxY(MaxY),
        setViewPort(0,0,MaxX,MaxY,1),
        clearViewPort. 
    Draw(Sy,N,I):-
        I<N,II = I+1,
        AA=I*Sy,BB=II*Sy,!,
        rectangle(AA,AA,BB,BB),
        Draw(Sy,N,II).
2 строка - в константу bgi_path записываем путь к каталогу BGI (у меня папка BGI расположена в одном каталоге файлом с исходным кодом программы)
14 строка - getMaxX(MaxX),getMaxY(MaxY), %получаем размеры окна
15 строка - setViewPort(0,0,MaxX,MaxY,1), %устанавливаем размеры и положение графического окна
16 строка - очищаем графическое окно.
20 строка - рисуем прямоугольник
7 строка - инициализация графического драйвера первый параметр =0 значит autodetect
описание предикатов в и параметров в [2].
Можно найти GRAPDECL.PRO - в нем описаны константы для использования графического режима.
22.05.2010, 20:42
AdAgent
Объявления
15.06.2010, 05:58  [ТС]   #2
rrrFer
Заблокирован
Рисование в Турбо Пролог

в примере выше необязательно было использовать ViewPort. Можно так:
Код Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
constants
    bgi_path = "BGI"
predicates
    Draw(integer,integer,integer)   
goal
    initGraph(0, 0, New_Driver, New_Mode, bgi_path),
    getMaxX(Mx),getMaxY(My),
    N=5,Sy=My div N,
    Draw(Sy,5,0),    
    closegraph().
clauses              
    Draw(Sy,N,I):-
        I<N,II = I+1,
        AA=I*Sy,BB=II*Sy,!,
        rectangle(AA,AA,BB,BB),
        Draw(Sy,N,II).
ViewPort это графическое окно, создается setViewPort, аргументы:
координаты верхнего левого угла, координаты нижнего правого угла, и флаг. Если флаг равен нулю, то при выходе изображения за границы графического окна, изображение не будет обрезано.
Если графическое окно не было создано - то основное окно используется как графическое. Для получения параметров ViewPort используется getViewSettings (параметры такие же как у setViewPort). Если создан ViewPort то координаты считаются относительно его верхнего левого угла.
Вобщем если мы захотим вывести такую же картинку, но шириной в половину экрана, и еще начать рисовать ее не из верхнего левого угла, а например, из точки с координатами [50,50] то удобно использовать viewPort:
Код Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
constants
    bgi_path = "BGI"
predicates
    makeViewPort(integer,integer)
    Draw(integer,integer,integer)   
goal
    initGraph(0, 0, New_Driver, New_Mode, bgi_path),
    makeViewPort(Mx,My),
    N=5,Sy=My div N,
    Draw(Sy,5,0),    
    closegraph().
clauses              
    makeViewPort(MX2,MY2):-
        getMaxX(MaxX),getMaxY(MaxY), 
        MM=50+MaxX/2,NN=50+MaxY/2,
        setViewPort(50,50,MM,NN,1),
        getViewSettings(X0,Y0,MaxX1,MaxY1,_),
        MX2=MaxX1-X0,MY2=MaxY1-Y0,
        clearViewPort. 
    Draw(Sy,N,I):-
        I<N,II = I+1,
        AA=I*Sy,BB=II*Sy,!,
        rectangle(AA,AA,BB,BB),
        Draw(Sy,N,II).
И еще, графическое окно позволяет очистить себя с помощью clearviewport, при этом будет очищено только графическое окно, а не весь экран(что происходит при работе cleardevice) - это тоже может быть когда-то удобно.
Другие темы раздела
Создайте предикат, который по данному списку строит список его элементов, встречающихся в нем не менее n раз Prolog
1. Создайте предикат, который по данному списку строит список его элементов, встречающихся в нем не менее n раз (списки одноуровневые).
Prolog Программа. Дистрибутивность.
Надо создать программу. Задание: Создать предикат, который по базе данных пролог-программы, содержащей определение некоторых двух алгебраических операций, определяет, выполняется ли свойство дистрибутивности одной операции относительно другой.
11.02.2011, 14:13  [ТС]   #3
rrrFer
Заблокирован
Рисование в Турбо Пролог / Prolog

вот в этой теме: Графика в TurboProlog я привел исходный код в котором используются предикаты getimage() и putimage(), теперь кратко опишу в чем их суть. Продублирую исходный код:
Код Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
constants
        bgi_path = "BGI"
predicates
        Draw(string,integer,integer,integer,integer,integer)
        Draw(integer,integer,integer)   
goal
        initGraph(0, 0, New_Driver, New_Mode, bgi_path),
        getMaxX(MMx),getMaxY(MMy),
        C=5,Mx=MMx div C,My=MMy div C,
        N=20,Sy=My div N,
        Draw(Sy,N,0),  
        getimage(0,0,Mx,My,BTMP),
        cleardevice(),
        Draw(BTMP,C,0,0,Mx,My).
clauses              
        Draw(_,C,_,_,_,_):-
                C<1,!.
        Draw(BTMP,C,Sx,Sy,Mx,My):-
                CC=C-1,SSx=Sx+Mx,
                putimage(Sx,Sy,BTMP,0),
                Draw(BTMP,CC,SSx,Sy,Mx,My).
        Draw(Sy,N,I):-
                I<N,II = I+1,
                AA=I*Sy,BB=II*Sy,!,
                rectangle(AA,AA,BB,BB),
                Draw(Sy,N,II).
        Draw(_,_,_):-!.
Добавлено через 20 минут
в строке 11 выводим на экран картинку по ширине и высоте в 1/5 часть экрана(как это делается описано выше). В переменных Mx и My у нас сохранены размеры этой картинки.
В строке 12 вызываем getimage и передаем координаты верхнего левого и нижнего правого углов прямоугольника, содержащего картинку. Изображение сохраняется в переменной BTMP (переданной в качестве пятого параметра).
Теперь изображение у нас сохранено, можем очистить экран, вызываем cleardevice в 13 строке.
В 14 строке вызываем Draw - тот Draw, который имеет 5 аргументов, при этом в качестве параметров передается по порядку: BTMP(изображение, сохраненное с помощью getimage), количество дублей изображения которое на до вывести, начальные координаты верхнего левого угла(координаты с которых начнется вывод изображений), ширина и высота изображения(для того чтобы определится с тем, насколько сдвигать новое изображение относительно предыдущего).
Рассмотрим подробнее как работает этот предикат.
Строки 16-17 нужны для остановки предиката(в случае если количество изображений которое осталось вывсти меньше единицы).
В строку 18 попадаем если это количество больше или равно 1.
В 19 строке уменьшаем на единицу количество изображений которое нам осталось вывести и рассчитываем координату по оси абсцисс для нового изображения.
в строке 20 выводим изображение по старым координатам(полученым в качестве параметров предикатом).
И наконец, в строке 21 вызываем Draw для отрисовки следующего экземпляра изображения по новым(рассчитанным в строке 19) координатам.
На экране получим 5 экземпляров изображения каждое из которых сдвинуто относительно предыдущего по оси абсцисс на ширину одного изображения. Первое изображение выводится начиная с координаты (0,0) верхнего левого угла.
Каждый экземпляр изображения представляет собой 20 прямоугольников, каждый размером в 1/100 экрана по ширине и высоте. Прямоугольники расположены по диагонали воображаемого прямоугольника, ширина и высота которого составляют 1/5 часть экрана.
11.02.2011, 14:13
Yandex
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Закрытая тема Создать новую тему

Похожие темы
Тема Раздел Автор Дата
Турбо пролог - Заказать программу
Привет всем нуждаюсь в помощи в работе с прологом В прологе валенок пытаюсь разобраться и не получается... помогите создать программу 1. Создайте предикат, вычисляющий 1!+2!+3!+...+n!. 2. Создайте предикат, осуществляющий разделение исходного списка на два подсписка. В первый из них...
Заказать программу johan 15.06.2012 16:55
Prolog: Русский Турбо Пролог 2.0
Не подскажите, как сделать, чтобы в Турбо Прологе 2.0 печатались русские буквы? Находил один способ в инете, но он оказался, увы, неработоспособным. Заранее спасибо.
Prolog Alex_C# 30.09.2010 16:32
Prolog: Турбо пролог
Помогите, пожалуйста, написать программки на турбо пролог: 1.Дан список, объектами которого являются числа. Между первым минимальным и первым максимальным элементами списка найти сумму положительных элементов списка; 2. Вычислить: 1к + 2к + … + nк, где к и n – натуральные числа. 3. Дан список,...
Prolog tanywa77 20.06.2010 20:17
Опции темы

Текущее время: 12:17. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.