Первые уроки по языку Postscript

файлы скопированы с сайта "http://xmlhack.ru/aff/andy/ps/"
и немного отредактированы. Написано Андреем Михеевым.

Часть 1. ОСНОВЫ

Оглавление

1. ВВЕДЕНИЕ
2. СОДЕРЖАНИЕ ТЕМЫ
2.1 Текстовая оболочка навигации по файловой системе - Midnight Commander.
2.2 Текстовый редактор
2.3 Интерпретатор PostScript
2.4 Основы языка PostScript
2.4.1 Основные концепции языка PostScript
2.4.2 Стек
2.4.3 Постфиксная нотация.
2.4.4 Единицы измерения
2.4.5 Структура PostScript-программы
2.4.6 Арифметические операторы
2.4.7 Графические операторы
2.4.7.1 Смещение начала координат
2.4.7.2 Поворот координат
2.4.7.3 Начало нового пути
2.4.7.4 Завершение пути
2.4.7.5 Свойства линии
2.4.7.6 Построение линии вдоль пути
2.4.7.7 Смещение текущей точки
2.4.7.8 Построение прямой линии
2.4.7.9 Построение дуги окружности
2.4.8 Описание учебной программы
2.5 Задание учащимся
3. ЗАКЛЮЧЕНИЕ
4. ПРИЛОЖЕНИЕ А - пример PostScript-программы
5. ПРИЛОЖЕНИЕ Б - результат работы PostScript-программы

ВВЕДЕНИЕ

Целью данной темы является:
  1. освоение учащимися основ работы с персональным компьютером;
  2. освоение учащимися навыков навигации по файловой системе;
  3. освоение учащимися навыков редактирования текста простым текстовым редактором;
  4. начальные навыки программирования.

СОДЕРЖАНИЕ ТЕМЫ

Текстовая оболочка навигации по файловой системе - Midnight Commander.

Для навигации по файловой ситеме используется текстовая оболочка Midnight Commander. Внешне эта текстовая оболочка похожа на все остальные текстовые оболочки (Norton Commander, Volkov Commander, etc.). Запуск Midnight Commander'а производится командой mc, в окне терминала.

Данная оболочка является настраиваемой. В двух окнах отображается содежимое двух (м.б. различных) каталогов. Оболочка имеет функции подсветки содержимого в зависимости от типа файла, его атрибутов. Каталог ".." означает переход на один уровень вверх. При нажатии клавиши "Enter" на файле с PostScript-программой, происходит автоматический запуск интерпретатора PostScript и отображение на экране данного файла.

Текстовый редактор

Учащимся предлагается использовать текстовый редактор, встроенный в Midnight Commander. Этот текстовый редактор вызывается функциональной клавишей F4, при установленном на файле курсоре оболочке.

Текстовый редактор имеет несколько "горячих" клавиш - F1..F10, назначение которых можно посмотреть на нижней панели редактора. Кроме того, редактор обладает разветвленным меню, вызываемым функциональной клавишей F9.

Наиболее употребительные операции при редактировании текстового файла:

Интерпретатор PostScript

Как было сказано выше, при нажатии на клавишу "Enter" в Midnight Commander'е, PostScript-программа запускается в интерпретаторе PostScript. Для отображения результата работы программы система запускает стандартный интерпретатор GhostScript и программу отображения GhostView. Программа отображения позволяет просмотреть результат в разных масштабах, распечатать результат на принтере, получить от интерпретатора новую версию отображения.

Интерпретатор и Midnight Commander работают одновременно, не мешая друг другу. Учащиеся могут переключаться между ними клавишами alt+Tab.

Основы языка PostScript

Основные концепции языка PostScript

Язык PostScript изобретен фирмой Adobe corp. в 1985 году. Назначение языка - стандартизация вывода информации, независимость результата вывода от устройства вывода и от программы, этот вывод инициирующей.

Язык PostScript - это язык описания страниц. Описание производится с помощью математических формул и объектов, что дает абсолютную переносимость описания страницы между платформами и операционными системами. Все, чем оперирует язык PostScript, - графические объекты, в том числе и текст.

На сегодняшний день язык PostScript является издательским и типографским стандартом. Интерпретаторы языка PostScript встраиваются в большинство бытовых печатных систем. Наличие же интерпретатора PostScript в издательской технике является обязательным.

Язык PostScript использует постфиксную нотацию для записи математических выражений.

Язык PostScript подразумевает, что программа состоит из слов, разделенных разделителями, в роли которых могут выступать пробел, комментарии, табуляция, символы конца строки и страницы. Несколько последовательных разделителей обрабатываются так же, как и один. Комментариями считается все, начиная от знака % и до конца строки.

Язык PostScript не накладывает ограничений на длину строк или на количество слов в строке.

Стек

Основа языка PostScript - стеки. В рамках данной темы учащимся предлагается усвоить только лишь понятие о стеке операндов, не упоминая остальные стеки языка.

Описание работы стека дается на примере работы монетницы.
Стек - это особая область памяти, организованная по принципу "последний вошел - первый вышел".
Учащимся предлагается самим привести примеры стека из жизни. Обычно учащиеся вспоминают: лифт, автоматный магазин, хозяйственную сумку.

Постфиксная нотация.

Язык PostScript использует постфиксную нотацию (обратную запись). Еще такой способ записи называется "польская запись".

Смысл такого способа записи состоит в том, что сначала записывают операнды, затем - операторы. На примере показываем, как выглядит обычное математическое выражение в постфиксной нотации:
img
Описываем принцип прочтения обратной записи: Предлагаем учащимся несколько примеров на самостоятельное построение.

Единицы измерения

PostScript используем свою единицу измерения - пункт (point), обозначаемую пт (pt). В одном стандартном дюйме (inch) помещается 72 пункта (pt).
img
Как пример перевода длины из миллиметров в пункты, используем подпрограмму cmm учебной программы.

В качестве угловой меры в PostScript используется градус (полная окружность = 360 градусов). Положительное направление отсчета углов - против часовой стрелки.

Структура PostScript-программы

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

Арифметические операторы

В PostScript вместо обычных знаков математических операций используются специальные слова, обозначающие эти математические операции:
+   add  
-   sub   
*   mul   
/   div   
Изучаем действие арифметических операторов на примере подпрограммы cmm учебной программы.

Прорабатываем применение арифметических операторов на примерах (самостоятельно):
img

Графические операторы

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

Смещение начала координат

При открытии страницы начало координат находится в левом нижнем углу. Оператор translate смещает начало координат в указанную точку:
10 20 translate
После выполения этого оператора начало координат сместится в точку (10,20).

Поворот координат

Оператор rotate поворачивает систему координат на произвольный угол (положительное направление - против часовой стрелки):
90 rotate
Поворачивает систему координат на 90 градусов против часовой стрелки.

-90 rotate
Поворачивает систему координат на 90 градусов по часовой стрелке.

Начало нового пути

Графические построения состоят из нескольких этапов:
  1. инициализация нового графического пути;
  2. построение графического пути с помощью графических операторов;
  3. определение типа линии;
  4. прорисовка линии вдоль построенного пути.
Оператор newpath начинает новый путь.

Завершение пути

После построения пути вдоль него может быть проведена линия. Это осуществляет оператор stroke. Путь, кроме того, можно "закрыть", при этом от текущей точки до первой определенной в пути точки проводится прямая линия. "Закрывает" путь оператор closepath.

Свойства линии

У линии можно задать несколько свойств: толщину, скругленность хвостиков, пунктирность, цвет и т.д. В нашей теме рассматривается только лишь толщина линии. Толщина линии задается оператором setlinewidth:
2.0 setlinewidth
Устанавливает толщину линии 2 пункта (2pt)

Построение линии вдоль пути

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

Смещение текущей точки

Смещение текущей точки можно произвести двумя способами:
Оператор Синтаксис Описание
moveto xPyPmoveto смещает текущую точку в точку с указанными координатами (x,y)
rmoveto dxPdyPrmoveto смещает текущую точку по вектору с указанными координатами (dx,dy)
По сути, оператор, начинающийся с буквы r, означает, что передаваемые ему координаты считаются не от начала координат, а от текущей точки.
Примеры:
200 150 moveto
100 32 rmoveto

Построение прямой линии

Оператор Синтаксис Описание
lineto xPyPlineto проводит прямую линию от текущей точки в точку с указанными координатами (x,y)
rlineto dxPdyPrlineto проводит прямую линию от текущей точки в точку, отстоящую от нее на указанном расстоянии по горизонтали dx и по вертикали dy (по вектору с указанными координатами)
После выполнения этих команд, последняя точка прямой линии становится текущей точкой.
Примеры:
201 110 lineto
10 302 rlineto

Построение дуги окружности

Дуга окружности, или окружность, строится оператором arc.

Syntax: x0 y0 R a1 a2 arc

x0 y0 - координаты центра окружности;
R - радиус окружности;
a1 a2 - начальный и конечный угол дуги окружности (0..360).

Угол 0 совпадает с положительным направлением оси OX.
Особенность оператора: если текущая точка пути определена, то от нее до начальной точки дуги проводится прямая линия!
После построения дуги, последняя ее точка становится текущей.
Дуга всегда рисуется против часовой стрели, независимо от соответствия углов друг другу. Для проведения дуги в обратном направлении (по часовой стрелке) применяют аналогичный по синтаксису оператор arcn.
Пример:
201 110 22 0 360 arc

Описание учебной программы

В приложении А приведен листинг учебной программы, с пронумерованными строками.

Строки 1-20 и 65-67 содержат начальные и конечные служебные инструкции, соответственно.

Описание некоторых строк программы:
1. Программа написана на языке PostScript, languagelevel 2
2. Создатель
3. Наименование документа
4. Дата создания документа
5. Количество страниц в документе
6. Порядок страниц
9. Подпрограмма перевода длины из миллиметров в пункты
12. Требуемое разрешение устройства вывода
14. Начало страницы 1
22. Сохранение текущих графических настроек
23-59. Операторы построения пути
61. Установим толщину линии
62. Проводим линию с заданными параметрами вдоль построенного пути
63. Восстанавливаем графические настройки
64. Показываем страницу

Задание учащимся

Написать программу, пользуясь учебной программой, которая бы рисовала фамилию, имя и отчество учащегося. Размер буквы - 10 мм на 20 мм, расстояние между буквами - 5 мм.

При необходимости использовать поворот координатной системы (если одно из слов не помещается поперек листа формата А4.

Учащимся предлагается изменить часть программы, содержащую графические операторы (выделена на примере жирным шрифтом).

Сначала необходимо нарисовать слова, в масштабе 1:1, в рабочей тетради. Затем - составить программу рисования этих слов.

ЗАКЛЮЧЕНИЕ

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

Результатом является распечатанная работа (фамилия, имя, отчество). Один экземпляр остается в классе, один экземпляр выдается учащемуся в качестве подарка за успешное освоение темы.

ПРИЛОЖЕНИЕ А - пример PostScript-программы

 1.   %!PS-Adobe-2.0  
 2.   %%Creator: MAV  
 3.   %%Title: TEST. PU-29  
 4.   %%CreationDate: Sun Jan 12 13:38:48 2003  
 5.   %%Pages: 1  
 6.   %%PageOrder: Ascend  
 7.   %%BoundingBox: 0 0 585 842  
 8.   %%EndComments  
 9.    /cmm { 72.0 mul 25.4 div } def % перевод из миллиметров в пункты  
 10.  %%EndProlog  
 11.  %%BeginSetup  
 12.  %%Feature: *Resolution 600dpi  
 13.  %%EndSetup  
 14.  %%Page: A 1  
 15.  %%BeginSetup  
 16.  %  
 17.  %%BeginFeature: *PageSize A4  
 18.  <</PageSize [595 842] /ImagingBBox null>> setpagedevice  
 19.  %%EndFeature  
 20.  %%EndSetup  
 21.  % начальные служебные инструкции закончены  
 22.  gsave  
 23.  30 cmm 230  cmm translate % передвинем начало отсчета  
 24.  newpath % начнем новый путь  
 25.  0 0 moveto % установим начальную точку в начало отсчета  
 26.  
 27.  % начинаем рисовать буквы "ПУ-29"  
 28.  % ширина буквы - 10 мм, высота буквы - 20 мм, расстояние между буквами - 5 мм.  
 29.  
 30.  % нарисуем букву "П"  
 31.   0 cmm  20 cmm rlineto % проводим линию на 20 мм вверх  
 32.  10 cmm   0 cmm rlineto % проводим линию на 10 мм вправо  
 33.   0 cmm -20 cmm rlineto % проводим линию на 20 мм вниз  
 34.  
 35.  % нарисуем букву "У"  
 36.   5 cmm  0 cmm rmoveto % смещаем текущую точку на 5 мм вправо  
 37.  10 cmm 20 cmm rlineto % проводим диагональ (10 мм вправо и 20 мм вверх)  
 38.  -10 cmm 0 cmm rmoveto % смещаем текущую точку на 10 мм влево  
 39.  5 cmm -10 cmm rlineto % проводим диагональ (5 мм вправо и 10 мм вниз)  
 40.  
 41.  % нарисуем тире  
 42.  10 cmm 0 cmm rmoveto % смещаем текущую точку на 10 мм вправо  
 43.  10 cmm 0 cmm rlineto % проводим линию на 10 мм вправо  
 44.  
 45.  % нарисуем цифру "2"  
 46.    5 cmm  10 cmm rmoveto  
 47.   10 cmm   0 cmm rlineto  
 48.    0 cmm -10 cmm rlineto  
 49.  -10 cmm -10 cmm rlineto  
 50.   10 cmm   0 cmm rlineto  
 51.  
 52.  % нарисуем цифру "9"  
 53.  5 cmm 0 cmm rmoveto  
 54.  10 cmm 10 cmm rlineto  
 55.  0 cmm 10 cmm rlineto  
 56.  -10 cmm 0 cmm rlineto  
 57.  0 cmm -10 cmm rlineto  
 58.  10 cmm 0 cmm rlineto  
 59.  
 60.  %  буквы нарисовали, далее следуют инструкции отображения пути  
 61.  2.0 setlinewidth  % установим толщину линии  
 62.  stroke % проводим линию устаноленной толщины вдоль построенного пути  
 63.  grestore  
 64.  showpage  
 65.  %%PageTrailer  
 66.  %%Trailer  
 67.  %%EOF  

ПРИЛОЖЕНИЕ Б - результат работы PostScript-программы

img

 

 

 

 

Часть 2. Дополнительные возможности

Оглавление

1. Тип линии
1.1 Пример использования оператора setlinecap
1.2 Типы линий
2. Использование пути в качестве маски
2.1 Множественные операции с фигурой
3. Сопряжение линий
4. Кривые Безье
5. Масштабирование
6. Шрифты
7. Приложение 1
8. Приложение 2

Тип линии

PostScript позволяет регулировать толщину линии (setlinewidth), ее "пунктирность" (setdash), "серость" (setgray), "круглохвостость" (setlinecap) и пр.
[4 5] 0 setdash
установить тип линни "пунктир", 4 пункта линия, 5 пунктов пропуск, смещение (оффсет) - 0.
1.5 setlinewidth
установить толщину линии в 1,5 пункта.
1 setlinecap
установить "скругление" хвостиков линий.

Пример использования оператора setlinecap

img
newpath  % линии разметки  
90 400 moveto 220 0 rlineto  
90 450 moveto 220 0 rlineto  
90 500 moveto 220 0 rlineto  
100 390 moveto 100 510 lineto  
300 390 moveto 300 510 lineto  
0 setlinecap 0.5 setlinewidth stroke  
  
newpath  % нижняя линия  
100 400 moveto 200 0 rlineto  
5.0 setlinewidth 0 setlinecap stroke  
  
newpath  % средняя линия  
100 450 moveto 200 0 rlineto  
5.0 setlinewidth 1 setlinecap stroke  
  
newpath  % верхняя линия  
100 500 moveto 200 0 rlineto  
5.0 setlinewidth 2 setlinecap stroke  

Типы линий

img
Далее представлен фрагмент программы для этих линий:
newpath 0 cmm 65 cmm moveto 160 cmm 0 rlineto  
1.0 setlinewidth  
[] 0 setdash % сплошная  
currentpoint % координаты текущей точки заносятся в стек  
stroke                  % построение линии вдоль пути  
moveto % перемещение в занесенные ранее в стек координаты  
/Times findfont 10 scalefont setfont (01) show % пишем цифры 01  
  
newpath 0 cmm 70 cmm moveto     % перемещение  
160 cmm 0 rlineto       % рисуем линию  
1.0 setlinewidth        % устанавливаем толщину линии  
[3 3] 0 setdash         % тип пунктирной линии  
currentpoint % координаты текущей точки заносятся в стек  
stroke                  % построение линии вдоль пути  
moveto % перемещение в занесенные ранее в стек координаты  
/Times findfont 10 scalefont setfont (02) show  
  
newpath 0 cmm 75 cmm moveto 160 cmm 0 rlineto  
3.0 setlinewidth  
[3] 0 setdash % пунктир из квадратов  
currentpoint % координаты текущей точки заносятся в стек  
stroke                  % построение линии вдоль пути  
moveto % перемещение в занесенные ранее в стек координаты  
/Times findfont 10 scalefont setfont (03) show  
  
newpath 0 cmm 80 cmm moveto 160 cmm 0 rlineto  
3.0 setlinewidth  
1 setlinecap % скругляем хвостики  
[0 14] 0 setdash % пунктир из точек  
currentpoint % координаты текущей точки заносятся в стек  
stroke                  % построение линии вдоль пути  
moveto % перемещение в занесенные ранее в стек координаты  
/Times findfont 10 scalefont setfont (04) show  
  
newpath 0 cmm 85 cmm moveto 160 cmm 0 rlineto  
3.0 setlinewidth 0 setlinecap  
[21 7 7 7] 0 setdash % штрих-пунктир обычный  
currentpoint % координаты текущей точки заносятся в стек  
stroke                  % построение линии вдоль пути  
moveto % перемещение в занесенные ранее в стек координаты  
/Times findfont 10 scalefont setfont (05) show  
  
newpath 0 cmm 90 cmm moveto 160 cmm 0 rlineto  
3.0 setlinewidth  
1 setlinecap % скругляем хвостики  
[21 7 7 7] 0 setdash % штрих-пунктир  
currentpoint % координаты текущей точки заносятся в стек  
stroke                  % построение линии вдоль пути  
moveto % перемещение в занесенные ранее в стек координаты  
/Times findfont 10 scalefont setfont (06) show  
  
newpath 0 cmm 95 cmm moveto 160 cmm 0 rlineto  
3.0 setlinewidth  
0 setlinecap % убираем скругление хвостика  
[21 7 7 7] 10 setdash % штрих-пунктир со смещением узора  
currentpoint % координаты текущей точки заносятся в стек  
stroke                  % построение линии вдоль пути  
moveto % перемещение в занесенные ранее в стек координаты  
/Times findfont 10 scalefont setfont (07) show  
  
newpath 0 cmm 100 cmm moveto 160 cmm 0 rlineto  
1.0 setlinewidth 0 setlinecap   
[21 7 7 7] 0 setdash % штрих-пунктир  
currentpoint % координаты текущей точки заносятся в стек  
stroke                  % построение линии вдоль пути  
moveto % перемещение в занесенные ранее в стек координаты  
/Times findfont 10 scalefont setfont (08) show  

Использование пути в качестве маски

Путь (path), начатый оператором newpath и сотворенный операторами рисования lineto, moveto, rlineto, rmoveto, arc, arcn, curveto и пр., может служить не только для проведения линии (stroke), но и как маска.

Для реализации этой возможности применим операторы gsave и grestore, которые сохраняют и восстанавливают (соответственно) текущие графические параметры.

В качестве примера - заливка контура (fill). Оператор setgray устанавливает текущую "серость", при этом 0 - черное, 1 - белое.
img
И - соответствующий фрагмент программы.
% звезда с заливкой без границ  
gsave  
newpath  
70 cmm 180 cmm moveto   
20 cmm 0 rlineto  
10 cmm 20 cmm rlineto  
-10 cmm 20 cmm rlineto  
-20 cmm 0 rlineto  
-10 cmm -20 cmm rlineto  
10 cmm -20 cmm rlineto  
0.8 setgray fill  
grestore  

Множественные операции с фигурой

Если мы хотим с построенной фигурой (путем) сделать еще что-нибудь, то эти действия обрамляются парой операторов gsave-grestore.

Примеры множественного использования одной фигуры: Звезда со штриховкой и контуром; звезда с заливкой, круговой штриховкой и толстым контуром (смотри также "шрифт как маска").
img
% звезда - штриховка и контур (слева на рисунке)  
newpath % начинаем путь  
20 cmm 180 cmm moveto   
20 cmm 0 rlineto  
10 cmm 20 cmm rlineto  
-10 cmm 20 cmm rlineto  
-20 cmm 0 rlineto  
-10 cmm -20 cmm rlineto  
10 cmm -20 cmm rlineto  
gsave % сохраняем текущие графические параметры  
clip % устанавливаем путь как маску  
0.4 setgray 0.1 setlinewidth % устанавливаем цвет линии и толщину линии  
-70 2 70 {newpath cmm 180 cmm moveto 50 cmm 50 cmm rlineto stroke} for % цикл  
grestore % восстанавливаем графические параметры "до штриховки"  
stroke % рисуем контур вдоль пути  
  
% звезда - заливка, штрих  и границы (справа на рисунке)  
gsave % сохраняем графические параметры  
newpath % начинаем путь  
120 cmm 180 cmm moveto   
20 cmm 0 rlineto  
10 cmm 20 cmm rlineto  
-10 cmm 20 cmm rlineto  
-20 cmm 0 rlineto  
-10 cmm -20 cmm rlineto  
10 cmm -20 cmm rlineto  
gsave % сохраняем текущие графические параметры  
0.9 setgray fill % зальем фигуру светло-серым  
grestore % восстанавливаем графические параметры "до заливки"  
gsave % и сохраняем их опять  
clip % устанавливаем путь как маску  
2 10 120 {newpath 0 setgray 0.5 setlinewidth exch 130 cmm exch 200 cmm exch 0 360 arc stroke} for   % цикл рисования окружностей  
grestore % восстанавливаем графические параметры "до штриховки"  
0 setgray 2.0 setlinewidth stroke % рисуем контур вдоль пути (граница)  
grestore % восстанавливаем графические параметры "до пути"  
Квадрат как маска - два варианта:
A-1) штриховка и границы,
A-2) только штриховка
img
% квадрат со штриховкой и границами (слева на рисунке)  
newpath  
10 cmm 120 cmm moveto   
50 cmm 0 rlineto 0 50 cmm rlineto -50 cmm 0 rlineto 0 -50 cmm rlineto  
gsave   
clip   
0.8 setgray .5 setlinewidth  
-40 2 70 {newpath cmm 120 cmm moveto 50 cmm 50 cmm rlineto stroke} for  
grestore   
stroke  
/Times findfont 10 scalefont setfont 30 cmm 115 cmm moveto (A-1) show  
  
  
% квадрат со штриховкой и без границ (справа на рисунке)  
newpath  
100 cmm 120 cmm moveto   
50 cmm 0 rlineto 0 50 cmm rlineto -50 cmm 0 rlineto 0 -50 cmm rlineto  
gsave   
clip   
0.5 setgray 1.0 setlinewidth   
50 2 200 {newpath cmm 120 cmm moveto 50 cmm 50 cmm rlineto stroke} for  
grestore  
/Times findfont 10 scalefont setfont 120 cmm 115 cmm moveto (A-2) show  
Маска может состоять из несвязанных областей:
img
% звезда разрывная - заливка, штрих  
gsave  
  
newpath  
120 cmm 230 cmm moveto   
20 cmm 0 cmm rlineto  
-20 cmm 40 cmm rlineto  
20 cmm 0 cmm rlineto  
-20 cmm -40 cmm rlineto  
gsave   
0.9 setgray   
fill  
grestore   
gsave   
clip  
2 10 120   
{newpath   
0 setgray   
0.5 setlinewidth   
130 cmm exch 250 cmm exch 0 360 arc stroke  
} for  
grestore  
  
grestore  
  

Сопряжение линий

На чертежах часто возникает необходимость сопряжения прямых линий. Для этого можно использовать оператор arcto. От текущей точки рисуется прямая линия по направлению к первой точке, производится сопряжение с линией, проведенной от первой точки ко второй. После сопряжения рисование прекращается. Параметры: координаты первой точки, координаты второй точки, радиус закругления. Необходима определенность текущей точки!
img
% сопряжение линий дугой радиусом 3 мм  
gsave  
  
newpath  
20 cmm 230 cmm moveto  
30 cmm 0 rlineto  
-20 cmm 10 cmm rlineto  
1 setlinecap % скругляем хвостики  
[3 3] 0 setdash % пунктир из точек  
0.1 setlinewidth  
stroke  
  
newpath   
20 cmm 230 cmm moveto  
50 cmm 230 cmm 30 cmm 240 cmm 3 cmm arcto 30 cmm 240 cmm lineto  
[ ] 0 setdash 4.0 setlinewidth   
stroke  
  
grestore  
  

Кривые Безье

Универсальные кубические кривулины. Проводятся от текущей точки по трем базовым. Оператор называется curveto. Параметры - координаты трех базовых точек.

Примеры.
img img
  
% кривая Безье  
gsave  
newpath 90 cmm  230 cmm moveto  
20 cmm 40 cmm rlineto currentpoint  
-50 cmm 0 cmm rlineto currentpoint  
10 cmm -40 cmm rlineto currentpoint  
[3 3] 0 setdash 0.1 setlinewidth  
stroke  
newpath  
90 cmm 230 cmm moveto curveto 2.0 setlinewidth [] 0 setdash stroke  
grestore  
  
% кривая Безье  
gsave  
newpath 90 cmm  275 cmm moveto  
-30 cmm 40 cmm rlineto currentpoint  
50 cmm 0 cmm rlineto currentpoint  
-50 cmm -40 cmm rlineto currentpoint  
[3 3] 0 setdash 0.1 setlinewidth  
stroke  
newpath  
90 cmm 275 cmm moveto curveto 2.0 setlinewidth [] 0 setdash stroke  
grestore  
  

Масштабирование

Если рисунок не помещается на странице - его не потребуется переделывать заново полностью, его достаточно масштабировать (оператор scale) - смотри масштабированные шестиугольники. Масштабирование производится по двум координатам - X, Y.
изображение примера смотри в приложении 1.
  
% масштабированные шестиугольники  
  
/star6 { 20 cmm 0 rlineto  
        10 cmm 20 cmm rlineto  
        -10 cmm 20 cmm rlineto  
        -20 cmm 0 rlineto  
        -10 cmm -20 cmm rlineto  
        10 cmm -20 cmm rlineto } def % определили процедуру   
  
newpath  
10 10 200 {  
           gsave   
           newpath   
           50 cmm 10 cmm moveto   
           100 div dup scale   
           star6 stroke grestore  
           } for  
stroke  
  

Шрифты

Шрифты рекомендуется внедрять в документ - меньше проблем. Шрифт сначала ищется, масштабируется, определяется. Для вывода текста необходима текущая точка.

Вывод осуществляется простыми текстом - в круглых скобках, либо двузначными шестнадцатеричными кодами - в угловых скобках. Команда show.
Примеры смотри в приложении 2.
  
%текст разного размера  
newpath  
/Times findfont 20 scalefont setfont  
20 cmm 100 cmm moveto  
(The Times) show  
/Times findfont 30 scalefont setfont  
20 cmm 110 cmm moveto  
(The Times) show  
/Times findfont 40 scalefont setfont  
20 cmm 120 cmm moveto  
(The Times) show  
/Times findfont 50 scalefont setfont  
20 cmm 140 cmm moveto  
(The Times) show  
  
% текст под разными углами (поворот системы координат)  
90 cmm 190 cmm translate  
0 20 180 { pop 0 0 moveto  (The Times) show 20 rotate} for  
stroke  
  
% Текст как маска  
% буква "A" не заливается, но используется как контурный путь  
newpath   
/Times findfont 350 scalefont setfont  
0 cmm -90 cmm moveto  
(A) false charpath  
gsave  
0.8 setgray fill  
grestore  
gsave clip  
10 20 600 {newpath 0 exch -90 cmm exch 0 360 arc stroke} for  
grestore  
4.0 setlinewidth  
stroke  

Приложение 1

img

Приложение 2

img
Hosted by uCoz