2012-07-02 53 views
1

我剛剛開始學習PostScript以便爲LaTeX生成圖形,並且我不知道如何將路徑與自身組合起來,因此筆劃只會影響繪製形狀的外邊框。我的代碼如下:PostScript路徑組合

/black { 0 0 0 1 setcmykcolor } def 
/gold { 0.02 0.17 0.72 0.05 setcmykcolor } def 
newpath 
    % the center is 1/2w and 1/2h 
    /cx { 1200 2.0 div } def % center-x 
    /cy { 600 2.0 div } def % center-y 
    /r { 600 9.0 div 
       4 mul 
      2.0 div } def % star's radius 
    cx r 0 cos mul add 
    cy r 0 sin mul add moveto 
    cx r 144 cos mul add 
    cy r 144 sin mul add lineto 
    cx r 288 cos mul add 
    cy r 288 sin mul add lineto 
    cx r 72 cos mul add 
    cy r 72 sin mul add lineto 
    cx r 216 cos mul add 
    cy r 216 sin mul add lineto 
closepath 
gsave 
gold fill 
grestore 
1 setlinewidth 
black stroke 

繪製筆畫時,將繪製交叉形狀的線條。我想知道是否有辦法只讓形狀的外部邊界受到影響,而不是內部線條。我寧願不必計算形成星形的線相交的位置,即,即保持5條線而不是10條較小的線。

另請注意,我正在學習PS並且不想使用外部程序(請閱讀Illustrator等)。這個問題的目的是建立我對PostScript的知識。

+1

如果有一個操作員來做這件事,那肯定會很好。 「maskpath」對它來說是個好名字。 –

+0

+1 @luserdroog,我也希望有一個'maskpath'運算符。小心組成一個? – Minustar

+0

我不知道我有能力做到這一點。我永遠無法讓我的Weiler-Atherton實施工作。我用'clippath'' reversepath''clip'和'eoclip'嘗試了一些實驗,但我無法獲得形狀的「外部」。但是我發現'clip'後跟'clippath'會讓你獲得Wyatt-Warnock的「縮小」形狀。但它是曲面細分的,不是無縫的;所以它在這裏似乎沒有幫助。 :( –

回答

2

最簡單的方法是先做筆畫然後填寫。您可能希望將線寬加倍,因爲這樣可以有效地將線條減半。

%... 
closepath 
gsave 
    2 setlinewidth 
    black stroke 
grestore 
gold fill 
+0

我喜歡你的解決方案,但它不是最佳 – Minustar

+1

同意但唯一的其他選項我可以看到像Weiler-Atherton這樣的東西,你走在路徑上並檢查所有的交點。在光亮的一面,徑向對稱意味着你只需要一個,其餘的都是旋轉。 –

1

PostScript缺少一個防滑運算符,它應該限制繪製到當前路徑之外。有clip,這限制了畫到裏面,但是這對這個問題沒有幫助。

正如之前建議的那樣,您可以在雙線寬處使用stroke,然後使用fill白色,但是如果您想將其繪製在其他物體之上,該策略會遮蔽下面的任何內容。

或者你可以讓這顆恆星有點大(我懷疑,但沒有檢查,通過currentlinewidth 2 5 sqrt 2 mul 5 div add sqrt mul 2 div),但那隻會看起來不錯,如果1 setlinejoin