графика вращения в постскриптуме

Мне было интересно, как я могу повернуть графику, скажем, прямоугольник на определенный угол в постскриптуме. Или, по крайней мере, есть способ нарисовать очень смело! типа, с углом!?

У меня есть список предложений по кругу, поэтому каждое или в 1 направлении, и теперь я хотел бы поместить каждое в прямоугольник и сделать для них гиперссылку.


person user702846    schedule 18.06.2011    source источник


Ответы (3)


Сила Postscript заключается в его безжалостном стремлении к идеалу «отложенного связывания». Выполнение вращений не является исключением. Он работает, используя более общий инструмент, матрицу аффинного преобразования.

Вы можете вращать как текст, так и графику (поскольку текст ЯВЛЯЕТСЯ графикой), поскольку все указанные пользователем координаты сначала умножаются на эту матрицу, чтобы получить координаты устройства.

Чтобы выполнить все необходимые трюки (масштабирование, вращение, сдвиг, перемещение), мы сначала должны расширить точки 2d до точек 3d на плоскости z=1 (не спрашивайте меня, почему; прочтите Математические иллюстрации Билла Кассельмана<). /em> или Adobe Blue Book для получения дополнительной информации).

[ x     [ a b 0 
  y   *   c d 0    =  [ x' y' 1 ] = [ ax+cy+e bx+dy+f 1 ]
  1 ]     e f 1 ]

Поскольку 3-й столбец матрицы всегда [ 0 0 1 ], он опущен во внешнем представлении, и матрица описывается в постскриптуме как:

[ a b c d e f ]

Поэтому, когда вы используете пару координат, скажем, для оператора moveto, moveto сначала преобразует ее в координаты устройства, x' = ax+by+e, y' = cx+dy+f, прежде чем добавить элемент <</move [x' y']>> к текущему пути. . Изменить матрицу: изменить «смысл» пользовательских координат.

Матрица идентичности такова:

[ 1 0 0 1 0 0 ]  % x' = x, y' = y

Для масштабирования замените единицы на коэффициенты масштабирования x и y:

[ Sx 0 0 Sy 0 0 ]  % x' = Sx*x, y' = Sy*y

Для перевода замените e и f смещениями перевода x и y:

[ 1 0 0 1 Tx Ty ]  % x' = x+Tx, y' = y+Ty

Чтобы повернуть, замените a,b,c,d коэффициентами масштабирования и сдвига sin и cos:

[ cosW sinW -sinW cosW 0 0 ]  % x' = x*cosW-y*sinW, y' = x*sinW+y*cosW, where W is angle(degrees) from x-axis

Вы «устанавливаете» эту матрицу с помощью concat, которая берет матрицу текущего преобразования (CTM), умножает ее на вашу новую матрицу и использует продукт в качестве нового CTM. Таким образом, translate, rotate и scale — это просто «удобные функции», которые можно реализовать следующим образом:

/translate { [ 1 0 0 1 7 -2 roll ] concat } def
/scale { [ 3 1 roll 0 0 3 -1 roll 0 0 ] concat } def
/rotate { [ exch dup cos exch sin dup neg 2 index 0 0 ] concat } def

Поскольку CTM является частью графического состояния, вы можете использовать стек графического состояния для иерархического управления вашими преобразованиями:

/box { % x y w h   %create a path in the shape of a box w*h with lower left corner at x,y
    4 2 roll moveto
    exch dup 3 1 roll
    0 rlineto
    0 exch rlineto
    neg 0 rlineto
    closepath
} def

/Courier 10 selectfont
100 100 100 100 box stroke   % draw an oriented box
120 120 moveto (inside) show
gsave
    150 150 translate   % make the center of the box the new 0,0 point
    45 rotate   % rotate CCW 45 degrees
    0 0 100 100 box stroke   % a rotated, shifted box
    20 20 moveto (inside) show
grestore
100 200 100 100 box stroke   % another box, just north of the first, in the original coordinte system
120 220 moveto (inside) show

Получается следующее изображение:

Вращение блоков и текста
(источник: googlecode .com)

person luser droog    schedule 21.10.2011

Я давно не использовал PostScript, но, насколько я помню, можно было просто использовать «поворот».

                             % do some steps
                             % ...
                             % ...
 20 20 moveto                % go to new position
 30 /Times-Roman SetFont     % select active font
 45 rotate                   % set direction to diagonal
 (Something)show             % print text "Something"
 showpage                    % show it all

ура Крис

person Kris_R    schedule 18.06.2011
comment
разве это не только для текста? не для цифр? - person user702846; 18.06.2011

Postscript отображает графику в заданном контексте, и именно этот контекст можно вращать (или масштабировать/перемещать) перед рисованием. Таким образом, любой элемент на изображении можно трансформировать как угодно, достаточно заранее выполнить необходимые преобразования контекста.

Однако, к сожалению, несмотря на то, что я могу дать вам представление об этом в этой статье, i является фундаментальной концепцией Postscript, и вы не сможете выполнять в ней никакой реальной работы, не поняв ее сначала. Я предлагаю прочитать краткое руководство, например, на http://paulbourke.net/dataformats/postscript/ .

Таким образом, имя «поворот» — это функция, которая вращает контекст графического объекта — вы используете поворот, прежде чем рисовать что-либо, что вы хотите (рендеринг текста также является «рисованием» в этом случае).

%!PS

(Helvetica) findfont 12 scalefont setfont   %select a font to use

300 300 translate    % sets the orign at 300,300 points from the bottom left of page

/start 5  def        % creates variable for keeping track of horizontal position of text

36                   % pushes number of repeats on the stack
{
    start 5 moveto   % places cursor on the starting position
    (postscript) show % renders the string in the starting position, within the current context

    /start  start 3 add def   % increases the value on the variable
   10 rotate         % rotates the context 10 degrees clockwise   (around the 300,300 new origin)
}  repeat           

showpage             % renders whole page 
person jsbueno    schedule 19.06.2011
comment
Спасибо за ссылку и ваш код, для меня сложной частью является вращение фигур, скажем, линии или прямоугольника ... Например, я хотел бы настроить ваш код, чтобы рисовать узкий прямоугольник вместо строк постскриптума. Поэтому я добавляю что-то вроде 5 10 moveto , однако это не работает... не могли бы вы дать мне подсказку! - person user702846; 20.06.2011
comment
Не могли бы вы сделать гиперссылку для каждого повернутого предложения, пожалуйста?! - person user702846; 10.07.2011