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, чтобы установить текущую точку.