2011-09-21 109 views
3

我學習後記我試圖創建一個方法,將繪製垂直梯度後記:繪製漸變

這裏是我的代碼:

%!PS-Adobe-3.0 

%%%%%%%%%%%%%%%%%%%%%%% 
% draw a RECTANGLE 
/Rect { 
/h exch def % height 
/w exch def % width 
w 0 rlineto 
0 h rlineto 
-1.0 w mul 0 rlineto 
0 -1.0 h mul rlineto 
} def 
%%%%%%%%%%%%%%%%%%%%%%% 
% draw a Gradient 
/VGrad { 
/h exch def % height 
/w exch def % width 
/c2 exch def %gray-end 
/c1 exch def %gray-start 
/index 0.0 def %loop-index 

0 1 h { %loop over height 
    gsave 
    c2 c1 sub index h div mul c1 add setgray 

    w h index sub Rect 
    stroke 

    /index index 1.0 add def % index++ 
    grestore 
    } for 

} def 
%%%%%%%%%%%%%%%%%%%%%%% 
%test script 
200 600 moveto 
.1 .9 100 10 VGrad 

showpage 

但GS引發錯誤:

GPL Ghostscript 8.70 (2009-07-31) 
Copyright (C) 2009 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
Error: /undefinedresult in --div-- 
Operand stack: 
    0 1 2 3 4 5 0.8 5.0 0.0 
Execution stack: 
    %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1862 1 3 %oparray_pop 1861 1 3 %oparray_pop 1845 1 3 %oparray_pop 1739 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- 6 1 10 --nostringval-- %for_pos_int_continue --nostringval-- 
Dictionary stack: 
    --dict:1150/1684(ro)(G)-- --dict:0/20(G)-- --dict:75/200(L)-- 
Current allocation mode is local 
Current file position is 588 
GPL Ghostscript GPL Ghostscript 8.708.70: : Unrecoverable error, exit code 1 
Unrecoverable error, exit code 1 

我在哪裏錯了?

+0

BTW,除非你使用DSC意見,魔線應該是'%!PS'甚至只是'%!'。 '-Adobe-3.0'部分是文件打算符合的DSC版本號。 –

回答

3

好的,我發現問題:看來索引是一個保留字。這裏是一個功能版本:

/box 
{ 
4 dict begin 
/height exch def 
/width exch def 
/y exch def 
/x exch def 
x y moveto 
width 0 rlineto 
0 height rlineto 
width -1 mul 0 rlineto 
0 height -1 mul rlineto 
end 
} bind def 


/gradient 
{ 
4 dict begin 
/height exch def 
/width exch def 
/y exch def 
/x exch def 
/i 0 def 
height 2 div /i exch def 

0 1 height 2 div { 
    1 i height 2.0 div div sub setgray 
    newpath 
    x 
    y height 2 div i sub add 
    width 
    i 2 mul 
    box 
    closepath 
    fill 
    i 1 sub /i exch def 
    }for 
newpath 
0 setgray 
0.4 setlinewidth 
x y width height box 
closepath 
stroke 
end 
} bind def 
2

我沒有完全理解你的代碼。但錯誤消息試圖告訴你,你除以零(查看剩餘操作數堆棧的頂層元素:「0」)。

僅僅通過加「1」到您的h變量(插入h1 add)使得通過Ghostscript的解釋器中運行您的PostScript程序,讓它吸取的東西(儘管這可能不會像你設想的....)。

6

你的程序將通過巧妙的堆棧操作和CTM影響執行得更快。

這不是一個像你這樣的平滑漸變,但執行速度要快得多,並且函數計算爲單行語句(我只是好像更好,無法解釋爲什麼)。

也很高興張貼使用和可能是一個樣本頁面(容易修剪,當你不需要它,但當你需要它?? ?? !!)無論如何,這是你的程序改寫我的方式,FWIW。

正如我所說的,它的輸出並不像現在這樣漂亮。但是您可以通過使用currenttransfersettransfer更改灰度傳遞函數和/或將框的計算更改爲對數縮放來更改梯度,並更改灰度的範圍和速度。這些東西應該更容易在「更緊密」的代碼中看到。堆棧評論可幫助您在每行結尾處「檢查您的理解」。

編輯:我不能停止玩它!我已經分析了這個循環,並找出了一些更多的參數。

編輯:另一個擴展。那麼一張漂亮的照片怎麼樣?

%! 

/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 

png output

+0

我破解了一些[螺旋漸變](http://groups.google.com/group/comp.lang.postscript/browse_thread/thread/2465c34c29662914/c8f902f387a25726#c8f902f387a25726)。圖像很漂亮,但代碼有點亂。 –

+0

即使早期程序'ygrad'沒有在這個圖像中使用,閱讀它將對希望瞭解後面的程序的postscript程序員非常有用。不要嘟my我自己的號角,但這不是初學者級的後記。在將它們饋送給循環操作員以獲得最大速度之前,它動態修改過程體。這個速度讓我們有機會做......呃..老鼠,我從來沒有對這種「未經優化的」代碼進行測量。所有這些hlalaballoo可能是完全沒有必要的。 :) –