В некотором коде, который выводит данные, я перебираю образцы и пытаюсь связать данные с кривыми, создавая метки (линии плюс текст) на лету. Таким образом, я создаю два не связанных пути параллельно. Оба элемента используют разные графические атрибуты и преобразованные системы координат, поэтому я использую gsave
... grestore
в партии, возможно, создавая неэффективный код.
Моя идея состояла в том, чтобы собрать инструкции для рисования одного из этих двух путей, а затем выполнить их, как только будет нарисован другой патч.
Возможно, cvx
может помочь, но мне интересно, как предотвратить выполнение операторов при добавлении их в массив (я ожидаю, что [ moveto ]
извлечет два элемента из стека до выполнения ]
). [ /moveto ]
справится?
И другая проблема в том, что сбор массива операций затруднен, когда мне нужен стек операндов для рисования другого пути.
Например, часть кода маркировки (некрасиво, потому что все еще работает) выглядит так:
gsave
currentpoint translate la rotate
0 rlineto
%% add a tick mark if it's far enough from the last one (or if it is important)
mlx x mly y distance lw 2 mul gt
m lm gt or
{ %if
/mlx x def
/mly y def
currentpoint
lw setlinewidth % label len
stroke
(Helvetica) findfont fs scalefont setfont
moveto % label
180 rotate
dup stringwidth pop neg fs 3 div sub fs -2.5 div
rmoveto
%% add a text label if it looks like there is room (or if it is important)
tlx x tly y distance fs 1.2 mul gt
m lm gt or
{ %ifelse
show
/tlx x def
/tly y def
}
{ pop } ifelse
/lm m def
} { pop }
ifelse
grestore