Как объекты могут быть сгруппированы в postscript? - PullRequest
1 голос
/ 28 февраля 2020

Я сделал картинку в постскриптуме, это наборы из 6 квадратов. Я хотел бы сгруппировать этот вывод как объект. да, я знаю, что могу создать определение функции, которая будет помещать это изображение. моя проблема в том, что я хочу вращать это изображение как группу, а не изменять каждую координату. каждого квадрата, который его создал. Я не уверен, если PostScript имеет эту функцию. Масштабируемая векторная графика имеет тег <g>. Извините, если это не совсем связано, но это та функциональность группировки квадратов, которую я хочу сделать.

Код для создания этой картинки:

%!PS
%I made PS extensions executable via evince on my system
/Sq {0 0 moveto 0 100 lineto 100 100 lineto 100 0 lineto closepath} def
gsave

150 150 translate

6{
Sq 87 -50.1 translate
60 rotate
}repeat

0 0 0 setrgbcolor
closepath
1 setlinewidth
stroke

squares

Я попытался установить closepath вне l oop и внутри функции Sq квадраты - это сгруппированные линии. может я не должен закрывать этот путь? Я действительно не знаю.

1 Ответ

2 голосов
/ 28 февраля 2020

PostScript не имеет понятия «группа», поэтому вы не можете группировать объекты. Вы можете поместить их в форму, но это редко, и в любом случае вы не можете делать то, что вам нужно.

Очевидное решение, как вы заметили, - просто определить функцию, которая выполняет рисование. Это «группа», или так близко, как вы собираетесь получить в PostScript.

Затем вы просто модифицируете CTM перед вызовом функции. Непонятно, как именно вы хотите применить вращение, но вот пример:

%!PS
%I made PS extensions executable via evince on my system
/Sq {0 0 moveto 0 100 lineto 100 100 lineto 100 0 lineto closepath} def

/Polygon {
  6{
    Sq 87 -50.1 translate
    60 rotate
  }repeat

  0 0 0 setrgbcolor
  1 setlinewidth
  stroke
} bind def

gsave
150 150 translate
Polygon
grestore

gsave
250 250 translate
45 rotate
Polygon
grestore

showpage

Обратите внимание, что вращение будет вращать CTM вокруг текущей точки. В этом случае это означает, что ваш многоугольник вращается вокруг первой вершины. Если вы хотите вращаться вокруг центра, вам нужно будет вычислить координаты центра многоугольника, перейти к этой точке, выполнить вращение, а затем вычислить координаты начальной вершины (помня, что CTM теперь вращается!) перед началом рисования многоугольника.

У вашей исходной программы есть несколько незначительных проблем; вы делаете gsave без соответствующего grestore, поэтому gsave не имеет никакого эффекта, и вы оставляете состояние сохранения в стеке gstate. Вам не нужен второй 'closepath', поскольку все подпути закрыты (опять же, в этом случае проблем не возникнет). Ваша программа также не выполняет 'showpage', поэтому технически соответствующий интерпретатор PostScript не будет ничего рисовать. Клоны NeWS, использующие Display PostScript, рисуют графические примитивы по мере их выполнения.

Если вы используете rmoveto и rlineto вместо lineto и moveto, вы можете переписать код, чтобы вам не нужно было «переводить» CTM и может просто использовать moveto, чтобы установить текущую точку.

...