Ваша программа будет выполняться быстрее, используя умные манипуляции со стеком и эффекты CTM.
Это не такой плавный градиент, как у вас, но он выполняется намного быстрее, а функции вычисляются в виде однострочных операторов (что мне просто лучше нравится , не могу объяснить, почему).
Также приятно опубликовать с использованием и, возможно, образец страницы (легко обрезать, когда вам это не нужно, но когда вам нужно это нужно ... ?? !!) В любом случае, вот ваша программа переписана по-моему , FWIW.
Как я уже сказал, вывод его не так хорош в его нынешнем виде. Но вы можете изменить градиент, изменив функцию передачи серого с помощью currenttransfer
и settransfer
и / или изменив вычисление полей на логорифмическое масштабирование, изменив диапазон и скорость серых оттенков. Эти вещи должно быть легче увидеть в «более узком» коде. Комментарии стека помогают вам «проверить свое понимание» в конце каждой строки.
Редактировать: Я не мог перестать играть с ним! Я вычеркнул цикл и выявил еще несколько параметров.
Редактировать: Еще одно расширение. А как насчет красивой картинки?
%!
/box { % x y w h
4 2 roll moveto % w h
1 index 0 rlineto % w h
0 exch rlineto % w
neg 0 rlineto %
closepath
} def
/poly { % n
0.5 0 moveto
{ ? rotate 0.5 0 lineto } % n proc
dup 0 360 4 index div put % n {360/n...}
repeat
closepath
} def
% num-slices shapeproc matrix grayproc agrad -
% repeatedly (fill shape, concat matrix, transform currentgray)
/agrad {
3 dict begin /gray exch def /mat exch def /shape exch def
({ //shape exec //mat concat currentgray //gray exec setgray })
token pop exch pop end bind repeat
} def
/shapes [
{ -0.5 -0.5 1 1 box fill } %box shape
{ 0 0 0.5 0 360 arc fill } %circle shape
{ 0 0 0.5 0 180 arc fill } %fan shape
{ 5 poly fill } %pentagon
{ 6 poly fill } %hexagon
] def
/mats [
{1 index 2 exch div 1 exch sub dup matrix scale } %pyramid matrix
{1 index 2 exch div 1 exch sub 1 matrix scale } %horizontal matrix
{1 index 2 exch div 1 exch sub 1 exch matrix scale } %vertical matrix
] def
% mat-no shape-no gray0 grayF n x y w h dograd -
/dograd {
gsave
4 2 roll translate % m sh g0 gF n w h
scale % m sh g0 gF n
3 1 roll % m sh n g0 gF
1 index sub 2 index div % m sh n g0 (gF-g0)/n
[ exch /add cvx ] cvx % m sh n g0 grayproc
3 1 roll setgray % m sh grayproc n
3 -1 roll shapes exch get % m gray n shape
4 -1 roll mats exch get exec % gray n shape mat
4 -1 roll %n shape matrix gray
agrad
grestore
} def
%mat shape g0 gF n x y w h
0 4 .7 .1 20 300 400 600 800 dograd
0 0 0 1 10 100 650 200 200 dograd
1 1 0 1 20 300 650 200 200 dograd
2 2 .5 1 30 500 650 200 200 dograd
0 3 1 0 40 100 400 200 200 dograd
1 4 1 .5 50 300 400 200 200 dograd
2 1 .5 0 60 500 400 200 200 dograd
0 2 .1 .9 10 100 150 200 200 dograd
1 3 .2 .8 20 300 150 200 200 dograd
2 4 .3 .7 30 500 150 200 200 dograd
showpage