MetaPost
Последнее изменение этой страницы: 09:32, 15 июля 2016.
Парадигма | Императивный |
---|---|
Спроектировано | Джон Хобби |
Первый появившийся | 1994 |
Стабильная версия | 1.902 / 23 апреля 2014 |
Печать дисциплины | Неявная, Динамическая, Строгая |
Портал: | metapost |
Название MetaPost относится и к языку программирования, и к интерпретатору языка программирования MetaPost. Оба были получены из языка программирования и интерпретатора Дональда Кнута Metafont. MetaPost превосходит его благодаря созданию диаграмм на языке программирования PostScript по геометрическому/алгебраическому описанию. Язык разделяет элегантный декларативный синтаксис Metafont для манипулирования линиями, кривыми, точками и геометрическими преобразованиями. Многие из ограничений для MetaPost вытекают из особенностей Metafont. Например, у чисел с фиксированной запятой низкая точность, достаточная для того, чтобы представить координаты точек в глиф, но это может быть недостаточным при работе с фигурами в увеличенном координатном пространстве. Более того, MetaPost поддерживает не все особенности файлов PostScript. Наиболее примечательно, что контуры могут состоять только из одного сегмента (так, чтобы регионы были просто соединены), и регионы могут быть заполнены только однородным цветом.
Содержание
Компиляция
Стандартный исходный файл MetaPost состоит из одной или нескольких фигур. Компиляция исходного файла генерирует EPS графику для каждой фигуры. Эти EPS-графики не являются самодостаточными в том, что шрифты, используемые в метках не встроены в графику. Если foo.mp является типичным для metapost исходный файл, то его содержимое следующей формы:
beginfig(1);
draw commands
endfig;
beginfig(2);
draw commands
endfig;
...
beginfig(n);
draw commands
endfig;
end;
Выполнение
mpost foo.mp
дает следующий результат:
This is MetaPost, Version hversioni
(foo.mp [1] [2] . . . [n] )
n output files written: foo.1 .. foo.n
Transcript written on foo.log.
Для пользователей, которые просто хотят “начать” использовать MetaPost, доступен MetaPost с предпросмотром. Это просто графический интерфейс MetaPost. Он генерирует единственное изображение с возможностью сохранить вывод в EPS и PDF форматах. Пользователь также может сохранить исходный код и может посмотреть логи компиляции для помощи в отладке.
Типы
Стандартные типы
В MetaPost десять типов. Эти типы позволяют пользователю сохранять части изображения для дальнейшего использования. Мы кратко обсудим каждый тип и рассмотрим, как они используются в обычной программе на MetaPost.
- numeric — числа
- pair — упорядоченные пары
- path — кривые Безье
- picture — изображения
- transform — преобразования, такие как сдвиги, повороты и наклоны
- rgbcolor or color — триплеты с каждым компонентом между 0 и 1 (красный, зеленый, синий)
- cmykcolor — четверня с каждым компонентом между 0 и 1 (циан, пурпурный, желтый и черный)
- string — строки символов
- boolean— значения "истина" - "ложь"
- pen — свойства штриха
Практически все языки программирования предлагают способы хранения и извлечения числовых значений. В этом и состоит смысл числового типа данных в metapost. Так как графика в metapost представляет собой просто двумерные картинки, видно, что упорядоченная пара необходима, чтобы идентифицировать каждую точку на изображении. Тип данных упорядоченной пары предлагают эту функциональность. Каждая точка в плоскости состоит из х (т. е. абсцисса) и у (т. е. ордината). MetaPost использует стандартный синтаксис для определения точек плоскости, например, (X, Y), где X и Y являются переменными числового типа.
Следующий код объявляет переменную числового типа, переменную типа упорядоченная пара и две - типа строка.
numeric idx;
pair v;
string s, name;
Заметьте, переменные числового типа не нужно объявлять. Ранее необъявленная переменная автоматически считается числоv при первом использовании.
Массивы
Как и многие другие языки программирования, MetaPost предоставляет возможность обращаться к переменной по индексу. После объявления переменной
pair a[];
становится возможным хранить точки в массиве с числовыми значениями в качестве индекса. Следующий код
a[1] := (0,1);
a[2] := (0,5);
a[3] := (10,20);
show a[1];
show a1;
j := 2;
show a[j] + a[j+1];
выводит на консоль
>> (0,1)
>> (0,1)
>> (10,25)
Заметьте, точка массива с индексом 1 может быть доступна как a[1] так же как и a1, т.е. опустив скобки. Последняя удобная и часто практикуемая нотация работает, пока индекс является простым числом. Если индекс - числовая переменная или выражение, тем не менее, скобки должны присутствовать, так как, например, aj будет четко ссылаться на несвязанную переменную с таким именем вместо индекса j от переменной a.
На самом деле в MetaPost как в макро-языке нет настоящих массивов. Но со стороны пользователя режим индексирования переменных выглядит в точности как массив.
Обычные команды
Команда draw
Наиболее распространенная команда в MetaPost - это команда draw. Эта команда используется для рисования кривых или изображений. Для того, чтобы нарисовать путь от от Z1:=(0,0) к Z2:=(54,18) до Z3:=(72,72), мы должны сначала решить, какими мы хотим видеть кривые. Например, если мы хотим, чтобы эти точки были просто соединены отрезками, то мы используем
draw z1--z2--z3;
Однако, если нам нужен плавный путь между этими точками, мы используем
draw z1..z2..z3;
Для определения направления кривой мы используем оператор dir. Ограничения на кривую Безье налагаются с помощью
draw z1{right}..z2{dir 45}..{up}z3;
Заметьте, что z2{dir 45} заставляет выходное направление у точки z2 быть под 45 градусов. Это подразумевает входное направление в 45 градусов. Для определения разных входных и выходных направлений мы используем
draw z1{right}..{dir θi}z2{dir θo}..{up}z3;
Команда fill
Другая стандартная команда в MetaPost - команда fill. Ее мы используем для заполнения замкнутых контуров (или циклов). Для создания цикла мы должны присоединить его к объявлению кривой. Например
path p;
p := z1{right}..z2{dir 45}..{up}z3--cycle;
fill p withcolor red;
draw p;
Просто как это необходимо для заполнения замкнутых контуров, также может потребоваться обратная операция. Например, межтрубное пространство может быть построено с помощью
color bbblue;
bbblue := (3/5,4/5,1);
path p,q;
p := fullcircle scaled (2*54);
q := fullcircle scaled (2*27);
fill p withcolor bbblue;
unfill q;
draw p;
draw q;
Кривая fullcircle - встроенная кривая, которая близко аппроксимируется к окружности в MetaPost с радиусом 1 пиксель, проведенная против часовой стрелки. Эта кривая не является в точности окружностью, т.к. она всего лишь параметризуется с помощью кривой Безье, а не с помощью тригонометрических функций; как бы то ни было, внешне она неотличима от окружности.
Команда arrow
При рисовании простых графиков и других иллюстраций использование команды arrow часто просто необходимо. Существует 2 типа команд arrow в MetaPost - drawarrow и drawdblarrow. Обеим командам требуется аргумент типа кривая. Например:
drawarrow (0,0)--(72,72);
рисует стрелку из точки (0,0) в точку (72,72) по прямой между двумя этими точками.
Команда label
Почти все фигуры в технической документации сопровождаются подписями, которые помогают прояснить ситуацию, для которой сделана иллюстрация. Команда label требует 2 аргумента - строку с подписью и точку. Например, команда
label("A", (0,0));
расположит букву "А" в координате (0,0), и прямоугольник вокруг этой отметки будет центрирован вертикально и горизонтально вокруг этой точки. Простые строки наподобие "А" не требуют верстки для удостоверения в том, что они появятся точно на фигуре.
Функции графики
Среди наиболее распространенных типов фигур TEX пользователи чаще всего встречаются с теми, которые нужны для построения гр,афика функции одной переменной. Создатели узнали об этом и создали пакет для выполнения этой задачи. Это вызывается
input graph;
У MetaPost есть возможность создания информации (т.е. упорядоченной пары) для отображения простых функций. Однако, для более сложных функций данные вероятно, должны быть построены с использованием внешних программ, таких как MATLAB (или Octave), Maple, Mathematica. Стандартный файл с данными может содержать следующее:
0.0 0.0
0.2 0.447214
0.4 0.632456
0.6 0.774597
0.8 0.894427
1.0 1.0
Эти данные представляют собой график f(x) = для шести равномерно распределенных точек в [0, 1]. Для отображения этих данных сначала должен быть определен размер графика. Выбрав ширину в 144 пикселя и высоту в 89 пикселей, минимальный график с этими данными может быть сгенерирован с помощью
draw begingraph(144bp,89bp);
gdraw "data.d";
endgraph;
Графический пакет предоставляет много команд для кастомизации сгенерированных графиков, и эти команды полностью задокументированы в инструкции к графическому пакету.
Смотри также
Автор статьи: Ионов А.А.
ISSN 2542-0356
Следуй за Полисом
Оставайся в курсе последних событий
Лицензия
Если не указано иное, содержание этой страницы доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» 4.0, а примеры кода – по лицензии Apache 2.0. Подробнее см. Условия использования.