Язык программирования MetaPost

Автор работы: Пользователь скрыл имя, 17 Сентября 2013 в 00:54, курсовая работа

Описание работы

MetaPost может быть полезным для тех случаев, когда картинку проще описать логически, нежели образно. MetaPost особенно широко используется для генерации картинок для технических документов, где некоторые свойства рисунка могут контролироваться математическими или геометрическими ограничениями, которые наилучшим образом выражаются в символьной форме. Другими словами, MetaPost не заменяет средства для ручного рисования или интерактивные графические редакторы. Это настоящий язык программирования для генерации графики и иллюстраций.

Содержание работы

ВВЕДЕНИЕ …………………………………………………………………………..….5
1. ЯЗЫК ПРОГРАММИРОВАНИЯ METAPOST…………………………………...6
1.1 MetaPost- конвейер…………………………………………………..6
1.2 Язык META………………………………………………………………….8
1.3 Базовые команды для рисования………………………..…..10
1.4 Интеграция текста………………………………………………......14
1.5 Заливка и цвета……………………………………………………..…16
2. АВТОМАТІЗАЦІЯ В METAPOST………………………………………………….18
2.1 Объекты picture, трансформация……………………………18
2.2 Циклы и условные операторы…………………………..……..19
3. Управление выводом MetaPost…………………………………………21
3.1 Предварительный просмотр графики MetaPost………21
3.2 Использование графики MetaPost в TEX, LATEX....…….22
4. пРАКТИЧЕСКАЯ ЧАСТЬ………………………………………………………....24
5. зАКЛЮЧЕНИЕ……………………………………………………………………....26
6. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ…

Файлы: 1 файл

Курсовая работа.docx

— 243.47 Кб (Скачать файл)

Удобно ввести свой собственный  масштабирующий множитель, скажем u. Затем  можно определить координаты относительно u и позже решать, хотим ли мы начать с u=1cm или u=0.5cm. Это даст контроль над тем, что масштабируемо и над тем, что нет, т. к. изменение u не повлияет на такие свойства как толщина линий. Есть много путей изменять вид линии сверх простого изменения ее толщины, однако механизмы управления шириной вводят много общих понятий. Соответствующие команды могут странно выглядеть, например, команда

pickup pencircle scaled 4pt

устанавливает толщину линии  в 4 пункта для последующей команды  draw. (Это примерно в 8 раз больше стандартной толщины линии).

С такой большой толщиной даже линия длины ноль выглядит как  большая жирная точка. Можно это использовать для создания решетки из жирных точек, имея одну команду drawdot для каждого узла решетки. Такая повторяющаяся последовательность команд draw записывается наилучшим образом как пара вложенных циклов:

 for i=0 upto 2:

   for j=0 upto 2: drawdot (i*u,j*u); endfor

 endfor

Внешний цикл исполняется  для i = 0,1,2, а внутренний — для j = 0,1,2. Результат — решетка три на три из жирных точек, как показано на рис. 3. Этот рисунок включает также больший вариант ломаной линии.

beginfig(2);

u=1cm;

draw (2u,2u)--(0,0)--(0,3u)--(3u,0)--(0,0);

pickup pencircle scaled 4pt;

for i=0 upto 2:

    for j=0 upto 2: drawdot (i*u,j*u); endfor

endfor        

endfig;


 

 

 

 

Рис.3

Программа начинается с beginfig(2) и заканчивается с endfig. Эти макросы, выполняющие административные функции, гарантируют, что результаты всех команд draw собираются вместе и транслируются в PostScript. Входной файл для MetaPost обычно содержит последовательность пар beginfig и endfig с командой end после последней пары. Если этот файл именован fig.mp, то вывод от команд draw между beginfig(1) и следующей endfig пишется в файл fig.1. Другими словами, числовой аргумент в макросе beginfig определяет имя соответствующего выходного файла. Далее все эти PostScript-файлы могут быть включены как рисунки в документы TEX или trof, если присутствует драйвер, который может работать с PostScript-картинками. Они также могут быть предварительно просмотрены до их включения в документ с тысячей страниц.

MetaPost применяется для рисовании как прямых, так и кривых линий. Команда draw с разделенными аргументами-точками рисует плавную кривую через эти точки. Есть много других способов нарисовать путь через те же самые пять точек. Для получения гладкой замкнутой кривой нужно добавить команду cycle к команде draw. Также возможно в одной команде draw смешивать кривые и прямые линии. Использование «--» между точками позволит изобразить прямые линии, а использование «..»  изобразит кривые.

Таким образом, описывая команду: draw z0..z1..z2..z3--z4—cycle, получим результат, показанный на рисунке 4.


 

 

 

 

Рис.4

Команда draw позволяет рисовать сплошную линию. На её основе в MetaPost создана команда для рисования стрелки drawarrow. Кроме drawarrow в MetaPost определена команда drawdblarrow, которая рисует кончик стрелки на обоих концах пути. Команды, типа draw, работают с объектами path (путь). Путь – это набор из точек (тип pair) с описанием как эти точки друг с другом соединяются. Минимальный путь, это одна точка. При рисовании такого пути в рисунке остаётся отпечаток в форме пера. Для уточнения пути в некоторых точках можно указать под каким углом должна подходить кривая к этой точке. Существует несколько типов соединений между точками. Два из них «..» и «--» уже описаны выше. Из других типов полезен тип «&» – «сращивание» (объединение двух путей без влияния друг на друга) и «---» – «натянутая» линия (то же, что и «--», но влияет на соседние соединительные участки).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.4 Интеграция текста

METRFONT был создан как  специализированный инструмент для создания шрифтов. MetaPost создавался как инструмент для рисования любых изображений, поэтому в него был встроен довольно мощный механизм вставки текста, позволяющий создавать надписи. Простейший способ сделать это с помощью использования команды label:

label (суффикс метки) ((выражение-строка или картинка), (выражение-пара));

Выражение-строка или картинка задает метку, а выражение-пара позицию для нее. Суффикс метки может быть пустым, что будет означать центрировать метку на заданных координатах.

Для создания надписи также  может использоваться команда dotlabel. Она в точности такая же как и команда label, за которой следует команда рисования точки в заданных координатах.

Другой альтернативой  является макрос thelabel. Он имеет такой же синтаксис, что и команды label и dotlabel, но он возвращает результат как первичный рисунок вместо его действительного изображения.

Для команд разметки, таких  как label и dotlabel, использующих строковые выражения для текста меток, строки печатаются в стандартном шрифте, определяемом строковой переменной defaultfont. Начальное значение defaultfont — это обычно "cmr10", но оно может быть изменено на другое имя шрифта присваиванием, например, defaultfont:="ptmr8r", где ptmr8r — это типичный способ сослаться на шрифт Times New Roman в TEX.

Есть еще числовое количество, называемое defaultscale, определяющее размер шрифта. Если defaultscale равно 1, то получается размер шрифта, который обычно равен 10 пунктам.

Также важным элементом является расположение надписи. Для того чтобы  уточнить с какой стороны от указанной точки расположить текстовую метку, нужно добавить суффикс к макросу label через точку. Всего существует восемь стандартных суффиксов: «.rt» — расположить справа, «.lft»-слева, «.top»-сверху, «.bot»-снизу, «.lift»-расположить снизу и слева по диагонали, «.lrt» — снизу и справа, «.ulft» — сверху и слева, «.urt» —сверху и справа.

Если label передаёт просто строку (тип string), то текст обрабатывается силами MetaPost. Для того чтобы строка была обработана LATEX, необходимо это указать с помощью разделителей btex и etex. Строка между этими разделителями обрабатывается LATEX, при этом в качестве заголовка используются инструкции перечисленные, в начала mp-файла между verbatimtex и etex. Таким образом можно использовать кириллицу и любую конструкцию, которую понимает LATEX.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.5 Заливка и цвета

Кроме рисования кривых часто  бывает необходимо закрасить какую-либо замкнутую область. Для этого существует команда fill. На вход команды fill подаётся объект типа path, при этом путь должен быть замкнутым, то есть оканчиваться командой cycle. Команда cycle автоматически замыкает кривую.

Пример: fill (выражение-путь) withcolor (выражение-цвет).

Выражение-цвет может иметь пять возможных значений, переводимых к четырем возможным цветовым моделям:

Действительный ввод        Переводимое значение

withcolor (rgb-цвет)          withrgbcolor

withcolor (cmyk-цвет)      withcmykcolor

withcolor (число)              withgreyscale

withcolor (ложь)                withoutcolor

withcolor (истина)            (текущая типовая модель цвета)

Для указанных моделей  цвета есть также

fill (выражение-путь) withrgbcolor (выражение-rgb-цвет)

fill (выражение-путь) withcmykcolor (выражение-стук-цвет)

fill (выражение-путь) withgreyscale (число)

fill (выражение-путь) withoutcolor

Объект-изображение не может  иметь более одной цветовой модели, последнее указание withcolor, withrgbcolor, withcmykcolor, withgreyscale или withoutcolor устанавливает модель цвета для любого отдельного объекта.

Модель withoutcolor требует небольших разъяснений: выбор этой модели означает, что MetaPost не будет писать команду выбора цвета в выходной файл PostScript для этого объекта. Для fill существует противоположная по смыслу команда unfill, которая, соответственно, убирает заливку в выбранной окрестности.

Ещё одно важное отличие  MetaPost от METAFONT это наличие цвета. Работа с цветом, обычно сложнее чем работа с чёрно-белым рисунком. До сих пор процедура переноса электронного цветного рисунка на бумагу не является тривиальной. В MetaPost управление цветом реализовано на довольно низком уровне. Цвет определяется объектом типа color и представляет из себя тройку чисел принимающих значение от 0 до 1: «(r,g,b)», где r соответствует красной, g – зелёной, а b – голубой компоненте. Существует пять предопределённых цветовых константы: red (1,0,0), green (0,1,0), blue (0,0,1), black (1,1,1) и white (0,0,0).

Нарисовать объект, выбранным  цветом, можно с помощью команды withcolor за которой следует сам цвет. Цвета можно складывать, вычитать, умножать на число. Пользуясь базовыми определениями можно создать сложные объекты.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2 Автоматизация в MetaPost

2.1 Объекты picture, трансформация

Картинка представляет из себя совокупность путей и точек которую можно подвергать трансформации. В уже существующие картинки можно добавлять пути, замкнутые области и другие картинки. Прежде чем к картинке что-то добавить её необходимо инициализировать.

В MetaPost есть две определённые по умолчанию картинки: nullpicture —  пустая картинка и currentpicture —текущая картинка. Пользуясь последней переменной, можно в любой момент сохранить  результаты промежуточной отрисовки. Добавление элементов к картинке производится с помощью инструкции addto, далее указывается картинка к которой добавляется тот или иной элемент. Путь добавляется с помощью инструкции doublepath, замкнутая область с помощью инструкции contour, а другая картинка с помощью инструкции also.

В MetaPost есть возможность трансформации трёхмерных юбъектов. MetaPost поддерживает следующие базовые линейные преобразования:

(х,у) shifted (а, b) =(х + а,у + а)

(х, у) scaled s = (sx,sy)

(х,у) xscaled s = (sx,y)

(x, y) yscaled s = (x,sy)

(x, y) slanted s = (x + sy,y)

(x, y) rotated θ   =(хсоsθ - у sinθ , x sinθ + у cosθ )

(x, у) zscaled (a, b) = (xa - yb, xb + уa)

Кроме перечисленных базовых  преобразований полезными для использования  являются макросы (х, у) rotatedaround ((a, b), θ) – поворот вокруг точки (а, b) на угол θ и (х, у) reflectedabout (z1, z2) – отражение относительно линии, проходящей через точки z1, и z2.

MetaPost поддерживает объекты типа transform, то есть можно определить любое необходимое преобразование, чтобы использовать его в дальнейшем.

2.2 Циклы и условные  операторы

Циклы и условные операторы  в META отличаются от того, что обычно есть в других языках программирования. Цикл не просто повторяет перечисленные  в теле цикла инструкции – он дублирует текст, то есть внутри цикла не обязательно должна находиться синтаксически законченная конструкция. Это же относится и к условным операторам.

Для изображения траектории шарика, который с постоянной скоростью движется в вдоль спицы, которая с вращается с постоянной угловой скоростью, надо построить минимодель явления и задать физические параметры: поступательную скорость вдоль спицы v, угловую частота w и начальные условия r и φ. Сама траектория создаётся с помощью следующего кода:

% Файл cycle.mp

v: = 27u;w: = 360;N: = 2.1;phi: = 45;r: = 5u;n: = 100;

path  p;   pair  O;

O: = (r*cosd(phi) ,r*sind(phi));

p:=0  for   i=0  upto  n:


 

 

 

 

 

 

 

Рис.5 Спираль

. . ( ( r+v*N* i /n) * dir (-w*N* i /n) + phi ))

endfor ;

draw p  withpen   pencircle   scaled   0.5u

dashed   evenly   scaled   lu;

Декларация upto это сокращение для step 1 until. Аналогично downto является сокращением для step -1 untull

Формальный синтаксис  цикла представлен ниже:

for   \=х1   step   x2   until   x3:   text (i)   endfor

Это одна из форм, которая  поддерживается META. Ещё одна форма, представляет бесконечный цикл:

forever:   "текст"  endfor

Для того чтобы выйти из подобного цикла необходимо воспользоваться конструкцией вида:

exitif   ("булево выражение")

Булево выражение, это  может быть переменная типа boolean (true/false) или результат сравнения чисел, точек, путей или преобразований. Операторы сравнения совпадают с операторами сравнения языка «С» за исключением оператора равенства «=» и оператора неравенства «< >». Выражение можно инвертировать с помощью приставки not и объединить с другим с помощью приставок and или or.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3 Управление выводом MetaPost

3.1 Предварительный просмотр графики MetaPost

Взаимодействие между  TEX и MetaPost может быть двояким. С одной стороны, графика MetaPost может импортироваться в документы, набираемые TEX и его друзьями. С другой стороны, MetaPost может поручить набор текстовых элементов TEX, LATEX или trof, например, текстовых меток или математических формул в графике. Таким способом графика MetaPost может легко принять стиль документа (шрифт, размер шрифта и т. п.) и соответствовать качеству его набора (использовать кернинг, лигатуры и т. п.). Это делает MetaPost идеальным инструментом для приготовления высококачественной графики для документов TEX или trof.

Вывод MetaPost – это вариант PostScript, называемый Encapsulated PostScript (EPSF). Графика MetaPost может, следовательно, быть просмотрена в любом PostScript-просмотрщике, например, GSview.

Ситуация становится только немного сложнее, когда вывод  MetaPost содержит текст. Обычно MetaPost не производит самодостаточные EPS-файлы, например, шрифты и таблицы кодировок не помещаются в вывод. Поэтому вывод MetaPost, содержащий текст, может быть показан с неверными шрифтами, неверными символами или вообще без текста в PostScript-просмотрщике. Долгое время, наиболее надежный путь для просмотра был в подготовке тест-документа, включающего все картинки MetaPost, обработке его либо TEX, либо LATEX, затем dvips и показу результирующего ps-файла в PostScript-просмотрщике. Однако, с версии 1.000 MetaPost ситуация изменилась. С этой версии MetaPost способен производить самодостаточные файлы EPS, которые могут быть достоверно просмотрены в независимости от того, есть ли в них текст или нет.

Информация о работе Язык программирования MetaPost