Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/100: Рейтинг темы: голосов - 100, средняя оценка - 4.77
Заблокирован

Рисование в Турбо Пролог

22.05.2010, 20:42. Показов 18949. Ответов 2

Студворк — интернет-сервис помощи студентам
Надоели темы студентов с просьбой нарисовать что-либо в Турбо-Прологе.
литература:
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 - в нем описаны константы для использования графического режима.
2
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.05.2010, 20:42
Ответы с готовыми решениями:

Турбо пролог
Помогите, пожалуйста, написать программки на турбо пролог: 1.Дан список, объектами которого являются числа. Между первым минимальным и...

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

Турбо Пролог - Списки
Я очень извиняюсь за создание одинаковой темы но Я НЕ МОГУ ПОНЯТЬ. Ранее уже была создана тема &quot;Удаление начала списка до заданного...

2
Заблокирован
15.06.2010, 05:58  [ТС]
в примере выше необязательно было использовать 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) - это тоже может быть когда-то удобно.
3
Заблокирован
11.02.2011, 14:13  [ТС]
вот в этой теме: Графика в 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 часть экрана.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2011, 14:13
Помогаю со студенческими работами здесь

Запрос о комплектующих [Турбо Пролог]
Доброе утро, Помогите определиться с направлением по которому решать задачу(деревья или запросы к базе данных), ну и по возможности не...

Операции со списками (Турбо Пролог)
Господа программеры требуеться помощь в написании программ может это комуто и покажеться простым но не мне суть задачи такова ...

Грамматика, распознавание цепочек [Турбо Пролог]
Добрый вечер. Подскажите как написать программку на турбо прологе: Задана грамматика G= (VN, VT, P, S); VN={ S }, VT={ a }, P= { 1. S...

Помогите с логической задачей на ТУРБО Пролог!
Три школьника, Петя, Толя и Сергей, оставшиеся в классе на перемене, были вызваны к директору по поводу разбитого в это время окна в...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Закрытая тема Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru