PostScript объединить два пути - PullRequest
0 голосов
/ 09 декабря 2018

Я делаю язык высокого уровня поверх postscript для своего курса по компиляторам и хочу создать две функции: concatenate и union, которые должны использовать два пути и соединять их.Конкатенация работает путем подключения конечной точки первого пути к начальной точке второго.Union works не соединяет конечные точки.

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

РАБОТА: Если я хочу выбрать два пути, один из которых сделан дугой, а другой - путем соединения трех точек, яможет взять следующие основные пути:

 newpath 100 200 70 0 45 arc  %create an arc path
 newpath 100 100 moveto  200 200 lineto 200 300 lineto %create a polygon

и объединить их (создавая линию от конечной точки дуги до начальной точки линий), позволив моему компилятору написать код:

newpath 100 100 moveto  200 200 lineto 200 300 lineto reversepath currentpoint newpath %stores the startpoint of the polygon to be used later

newpath 100 200 70 0 45 arc % creates the arc
lineto  %takes the saved information about start of the polygon and creates a line to it
100 100 moveto  200 200 lineto 200 300 lineto  %finishes by adding the polygon to the path

ПРОСТО НЕ УКАЗАТЬ:

Я работаю с необработанными строками, которые я использовал для создания этих путей, но как поступить в случае, если пользователь создал привязки для путей, иТеперь я хочу присоединиться к ним.Например, предположим, что пользователь создал привязки:

/p1 {  newpath 100 200 70 0 45 arc } bind def
/p2 {  newpath 100 100 moveto  200 200 lineto 200 300 lineto } bind def

Как я могу приступить к объединению этих двух путей по мере необходимости БЕЗ изменения привязок?

Я пробовал что-то вроде

p1 uappend p2

, но это не сработало.Я не могу найти помощь даже после долгих дней поиска.

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вы можете довольно легко объединить две процедуры, поскольку они являются просто массивами.

% [a] [b]  join  [ab]
/join { 2 array astore [ exch {{}forall}forall ] } def

/p1p2  //p1 //p2 join cvx  def

Но я повторяю мой комментарий: вам следует удалить newpath, потому что он только мешает.Это почти никогда не требуется в программировании на PostScript.Это приводит к побочному эффекту аппаратного сброса, который обычно не подходит для всех ваших функций.Каким-то образом он попал в учебные пособия, так что все делают это, но ничего полезного IME не делает.

p1 uappend p2

Этот код предлагает «инфиксное мышление», поэтому в качестве первого прохода мы должны исправить это до

p1 p2 uappend

Но uappend работает с объектами пользовательских путей , поэтому вам нужно найти оператор, который принимает текущий путь и возвращает объект пути пользователя .

0 голосов
/ 09 декабря 2018

Вы можете загрузить определение функций и посмотреть содержимое исполняемого массива.

/p1 load {==} forall

покажет вам, как это выглядит.Или вы можете определить версии каждого из операторов пути, которые хранят свои операнды и просто выполняют процедуры.

/moveto {....} def
/lineto {....} def
...
...
p1 p2

Как обычно, с проблемой программирования существует множество возможных решений.

...