|
Программирование
On-line приложения
Почитать
Web-сервер Apache
Печать и форматирование
MySQL
Разные рецепты
Сборка/установка
Справки
Философия
Мой опыт
Скачать
Программы на Tcl/Tk (GUI)
Программы на Python/Tk (GUI)
Программы (CLI)
Help
Хобби
Фракталы
on-line
Язык для рисования фракталов
Гиперкуб
Теория относительности
Ампуллярии
Преподавание
Студенту/абитуриенту
Мой опыт
Автора!
|
Fact на примерахЗдесь приведено неформальное описание основных возможностей языка Fact на примерах. В дистрибутиве вместе с программой содержится несколько примеров. Здесь я рассматриваю и комментирую некоторые из них. Первый рисунокЗапустите программу # элементарное рисование # bgcolor 1 1 1 # цвет фона белый width .05 # толщина линии jump .25 .25 # смещаемся color 0 0 0 # выбираем чёрный цвет draw .5 0 # линия вправо color 1 0 0 # красный draw 0 .5 # линия вверх color 0 1 0 # зелёный draw -.5 0 # линия влево color 0 0 1 # синий draw 0 -.5 # линия вниз В окне будет сделан рисунок:
Как видите, программа состоит из слов, разделённых пробелами.
Если в строке обнаружен символ color 1 0 0 # устанавливаем красный цвет color # устанавливаем цвет
1 # доля красного
0 # доля зелёного
0 # доля синегоОперации установки цвета ( Операции, задающие размеры работают относительно текущей системы координат. По умолчанию система координат такова: ось x совпадает с нижней границей области отрисовки, ось y — с левой. Длина стороны равна единице. Толщина линии Инструкция Инструкция Масштабирования, повороты и повторения операцийПример # повторение операций # bgcolor 1 1 1 # цвет фона белый width .05 # толщина линии color 0 0 0 # выбираем чёрный цвет scale .1 # + уменьшаем единицу измерения в 10 раз jump 5 8.5 # смещаемся right 126 # + поворачиваем вправо на 126 градусов repeat 5 # + повторяем пять раз draw 0 4 # линия вдоль оси x right 72 # + поворачиваем вправо end # + конец блока Команда Операция Со слова Результат работы кода таков:
Использование переменныхТретий пример является лишь модифицированным вторым примером. В нём критичные параметры задаются с помощью переменных: # использование переменных # set n 6 # + устанавливаем переменную n set a 120 # + начальный поворот 90+180/n set b 60 # + поворот в каждой вершине 360/n set l 3.4 # + длина грани bgcolor 1 1 1 # цвет фона белый width .05 # толщина линии color 0 0 0 # выбираем чёрный цвет scale .1 # уменьшаем единицу измерения в 10 раз jump 5 8.5 # смещаемся right a # + поворачиваем вправо на 126 градусов repeat n # + повторяем пять раз draw 0 l # + линия вдоль оси x right b # + поворачиваем вправо end # конец блока Для присвоения переменным значений
используется инструкция Однажды определённую переменную можно потом использовать везде, где требуются аргументы. В данном случае результат будет таким:
Но среди примеров, содержащихся в дистрибутиве, есть несколько вариаций этого примера, где строятся звёзды и подкрашенные звёзды. ПодпрограммыЧетвёртый пример ( # подпрограммы
#
def sq # + определении процедуры рисования
# квадрата от его центра
jump -.5 .5 # смещаемся из цента в левый-верхний угол
repeat 4 # четыре раза повторяем следующие операции
draw 1 0 # рисуем вдоль оси х
right 90 # поворачиваем вправо
end # конец повторяемого блока
end # + конец определения процедуры
scale .25 # масштабируем в четыре раза
jump 2 1 # смещаемся
width .02 # устанавливаем толщину линии
bgcolor 0 0 0 # устанавливаем цвет фона
color 1 1 1 # белый цвет
call sq # + нарисовать квадрат
color 1 0 0 # красный цвет
call sq # + нарисовать квадратПодпрограмма это последовательность операций,
заключённая между директивами Вызывать подпрограмму можно в любом месте программы
инструкцией Результат работы этой программы будет таков:
Обратите внимание, что подпрограмма начинает рисовать квадрат из центра, а заканчивает рисование в левом-верхнем углу квадрата. Поэтому красный квадрат получился нарисованным вокруг левой-верхней вершины белого. Часто бывает нежелательным, чтобы процедура вносила изменения в текущий контекст. Чтобы этого добиться существуют средства локализации контекста. Локализация контекстаПятый пример является модернизацией четвёртого и иллюстрирует локализацию. # локализация контекста
#
def sq
local # локализация контекста
jump -.5 .5
repeat 4
draw 1 0
right 90
end
end # конец локальной области
end
scale .25
jump 1 1
width .02
bgcolor 0 0 0
color 1 1 1
call sq
color 1 0 0
jump 2 0 # смещаемся вправо
# иначе квадраты наложатся
# друг на друга
call sqВсе инструкции между директивами
Локализуются только переменные и смещения. Однако
процедуры, определённые внутри блока Если вам требуется локализовать цвет и толщину, то
используйте переменные в директивах Существуют аналогичные инструкции, локализующие только работу с системой коориднат или только переменные. Подробнее смотри полное описание Fact. Условные операции и рекурсияПростые итерации можно получить при помощи оператора # условные операции
#
def sq
local
jump -.5 .5
repeat 4
draw 1 0
right 90
end
end
end
scale .2
jump 2.5 1
width .02
bgcolor 0 0 0
color 1 1 1
repeat 10
call sq
jump 0 .5 # мы на верхней грани куба
right 45 # поворот на 45 градусов
scale 0.70710678 # масштабирование в "корень из двух" раз
jump 0 1
endТак как при каждом построении мы масштабируем систему координат, то в результате у нас получится последовательность уменьшающихся квадратов.
Однако рекурсия позволяет получить ветвящиеся деревья. Вот пример программы, реализующей рекурсию: # условные операции и итерации
#
def sq
local
jump -.5 .5
repeat 4
draw 1 0
right 90
end
end
end
def sq_seq
call sq
if level lt 7 # + проверка условия
local
add level 1
jump 0 .5
scale 0.70710678
local
right 45
jump 0 1
call sq_seq
end
local
left 45
jump 0 1
call sq_seq
end
end
end
end
jump .5 .2
scale .18
width .02
bgcolor 0 0 0
color 1 1 1
set level 0
call sq_seqПодпрограмма Что делает подпрограмма Первым делом она отрисовывает квадрат (
В этом примере новой для нас является проверка условий. В общем виде условие может проверяться так: if <переменная или значение> <операция> <переменная или значение> ...последовательность операций... end или if <переменная или значение> <операция> <переменная или значение> ...последовательность операций... else ...альтернативная последовательность операций... end Операции (
Если выражение идущее после Блок Приведу несколько примеров: if 1 lt 2 color 1 0 0 # красный end Будет установлен красный цвет, так как 1 действительно меньше, чем 2. set one 1 set who 2 if one gt two color 1 0 0 # красный else color 0 1 0 # зелёный end Будет установлен зелёный цвет, так как выражение 1>2 ложно. Кроме проверки условий здесь ещё используется
операция Можно ли сделать так, чтобы ветки не накладывались друг на друга? Да. Среди примеров, поставляемых с программой есть вот такой:
Я не буду подробно разбирать его (ничего принципиально нового там нет).
Идея же очень проста: на каждом шаге мы считаем не только
уровень вложенности ( Окраска отображает значения счётчиков правых и левых поворотов: чем больше зелёного, тем больше правых, чем больше красного, тем больше левых. Вы можете сами «поиграться» с этим примером. В этой заметке не были освещены ещё несколько функций, облегчающих отладку и управляющих отрисовкой. За более подробной информацией обратитесь к описанию Fact. |
|
|
|