PostScript语言教程(六、图形变换)
6.1、坐標系變換
POSTSCRIPT圖形操作是在一個坐標系中,這個坐標系被稱為用戶坐標系或用戶空間,該坐標系獨立于任何物理設備。POSTSCRIPT在用戶空間中進行繪制,并將結果傳輸到特定的打印機設備(設備空間)中。
在程序中,通常使用默認的坐標系。在這個空間中,原點是在頁面的左下角,量度是1/72英寸長度。
然而,用戶空間是可塑性的,他的坐標系可能是在位置,方向,大小變化后的。
6.1.1、用戶空間的平移
translation是從一個地方運動到另一個地方。這個運動是原點的運動。例如:
100 200 translate
將會把原點右移100個單位,上移200個單位,隨后的操作都是根據這個新的原點進行測量。
下面的程序將說明這個轉化效果。
/Times-Roman findfont 30 scalefont setfont
/square %一個填充的方塊
{
newpath
0 0 moveto
90 0 lineto %定義正方形的路徑
90 90 lineto
0 90 lineto
closepath fill %進行填充
6 92 moveto %文本顯示
(A Box) show } def
square %繪制一個方塊
200 250 translate %將原點移動x + 200 y + 250
square %繪制第二個方塊
200 250 translate %原點再次移動x + 200 y + 250
square %繪制第三個方塊
showpage
這個程序定義了一個方塊,然后通過原點變換獲得了三個方塊。
注:原點的變換是相對于當前原點而不是起始原點。
6.1.2、用戶空間的旋轉
rotate是從棧中取出一個數然后進行逆時針旋轉坐標軸。(旋轉的單位是度)
/Times-Roman findfont 30 scalefont setfont
/square
{
newpath
0 0 moveto
90 0 lineto
90 90 lineto
0 90 lineto
closepath fill
6 92 moveto
(A Box) show } def
square
300 150 translate
60 rotate %逆時針旋轉90度
square
300 150 translate
60 rotate %逆時針旋轉60度
square
showpage
在此,我們只是改變了坐標系的位置,方塊實際上的定義從未改變。
6.1.3、用戶空間的縮放
scale運算符允許更改坐標單元的大小,這個運算符獲取兩個參數,一個x縮放,一個y縮放,例:
3 3 scale
執行此操作,將會將x,y放大為原來的三倍。
在此通過小方塊例子
/Times-Roman findfont 30 scalefont setfont
/square
{
newpath
0 0 moveto
90 0 lineto
90 90 lineto
0 90 lineto
closepath fill
6 92 moveto
(A Box) show } def
square
300 150 translate
1.5 1.5 scale %擴大1.5倍
square
300 150 translate
0.5 2 scale %x 縮小到原來的1/2 y變為原來的2倍
square
showpage
6.2、繪圖狀態
目前為止,我們工作在當前的繪圖狀態中,構成當前環境包括(路徑,點,灰度值,字體,線寬,用戶坐標系)。
6.2.1、保存當前的圖形狀態
有時候我們需要保存當前的圖形狀態,以便以后可以隨時得到他。
例如:如果想要打印一個填充的圖形,我們就必須要構建一個適合的路徑,然后填充他。不幸的是fill操作符將會清除當前的路徑。所以在執行fill前應先保存當前的路徑,在fill之后再恢復保存的路徑就可以了。
保存和恢復圖形狀態的操作符是gsave和grestore。
gsave操作符將當前圖形狀態的副本保存在圖形狀態的堆棧中。這個堆棧最多可保存32個圖形狀態(包括當前圖形狀態)。
grestore操作符恢復最新的gsave圖形狀態。包括當時的所有特征,路徑,灰度,線寬,用戶坐標系。
下面是一個五角星來演示這些操作符的使用
/starside
{
72 0 lineto
currentpoint translate
-144 rotate } def
/star %stack: x y
{
moveto
currentpoint translate
4 {starside} repeat
closepath
gsave
.5 setgray fill
grestore
stroke }def
200 200 star
showpage
在這個程序,定義了兩個步驟
starside繪制了組成該星星的一條直線。
star根據坐標點填充星星。
添加一條水平線
72 0 lineto %星星的邊長為72
將坐標系原點移動到水平線的末尾
currentpoint translate
再講坐標系順時針旋轉144度
-144 rotate
repeat:這個運算符需要兩個參數
一個數字(例子中的4)
一組用括號括起來的運算(starside)
意思為執行指定運算4次
4 {starside} repeat
然后跟上結束符,完成路徑繪制
closepath %畫筆回到起點
進行圖形的填充(填充操作會清空路徑信息所以要提前保存,不保存的話1.路徑被清空,不會顯示變沿線以及中間的五邊形,灰度清空所有線的灰度值會一樣,看不出輪廓)
gsave .5 setgray fill %將灰度值設置為0.5進行填充 grestore %恢復保存的默認狀態
以200 200的坐標點繪制當前圖形,然后提交當前頁面到紙張。
200 200 star showpage
6.3、曲線
通常圖形圖像不僅僅是由直線構成,在postscript中可以使用運算符來定義任何期望的曲線。
6.3.1、圓弧
在本節中我們將討論圓弧曲線arc
arc操作符是將圓弧添加到當前路徑,他需要五個參數
弧的曲率中心的x,y坐標、曲率半徑、以及從正x軸逆時針測量的弧的起始和結束角。
例:中心在100 150 半徑為36 從逆時針45到90
100 150 36 45 90 arc
arcn運算符和arc類似,只是在方向上相反,為順時針
100 150 36 45 90 arcn
第一條線是畫了一個圓弧
第二條線是先將圖龜移動到300 365 然后以40度起點到60度起點畫弧
newpath 300 400 54 40 140 arc stroke newpath 300 365 moveto 340 345 54 40 140 arc stroke showpage
6.3.2、橢圓
圓可以認為是一個0到360的弧線
橢圓可以認為是將坐標系非均勻縮放之后的圓
/doACircle
{
0 0 54 0 360 arc stroke } def
/doAnEllipse
{
1 .75 scale %橫坐標不變,縱坐標變為原來的0.75
doACircle %繪制圓
stroke } def
300 500 translate doACircle
4 {0 -72 translate %不斷縮放坐標系
doAnEllipse} repeat
showpage
6.3.3、圓角
相交線經常通過圓角進行連接,postscript的arcto運算符提供了一種方法。
操作員除了當前點意外需要兩個點和一個半徑
可以這樣理解:以起始點開始,第一個點為線段連線,再將第一個點和第二個點連線,組成相交的一個角,以r為半徑的圓相切與這兩個直線,最后形成的弧度即為圓角。
例:列出了兩個圓角,分別為兩條線段的角度,相同,第一條線段的長度相同,第二條線段的長度不同,可以看到,兩個弧度的大小是一樣的。
/DrawAnX
{
3 3 rmoveto
-6 -6 rlineto
0 6 rmoveto
6 -6 rlineto
stroke
}def
50 50 moveto DrawAnX
50 150 moveto DrawAnX
150 150 moveto DrawAnX
50 50 moveto
50 150 150 150 36 arcto
4 {pop} repeat
200 50 moveto DrawAnX
200 150 moveto DrawAnX
400 150 moveto DrawAnX
200 50 moveto
200 150 400 150 36 arcto
4 {pop} repeat
stroke
showpage
注意:在圓角繪制完成后,當前的圖龜停留在最后一次相切的圓角的末端。以第一個圓弧為例,
起始點 50 50
圓規確定的點是 50 150 150 150 36
此時在arcto運算符執行后有一組數據保留在了堆棧中,分別是圓角的起始點和終止點。
起始點 50,150 - 36 = 114
終止點 50 + 36 = 86,150
這四個點對于我們來說是沒有必要的,所以,我們要將其從堆棧中刪除。
例:打印一個logo
% ------------ Define Procedures -------------
/Helvetica-Bold findfont 27 scalefont setfont
/fourpops %四次出棧
{
4 {pop} repeat } def
/background %繪制背景
{
0 18 moveto
0 72 108 72 18 arcto fourpops
108 72 108 0 18 arcto fourpops
108 0 0 0 18 arcto fourpops
0 0 0 72 18 arcto fourpops
fill } def
/moon
{
.6 setgray %繪制logo中的小圓
81 45 18 0 360 arc fill
} def
/omaha %繪制字體
{
1 setgray
0 -1 moveto
1 2 scale %更改坐標系比例
(OMAHA) stringwidth pop %獲取OMAHA字符串的寬度
108 exch sub 2 div %108 - (字符寬度 / 2)作為x的偏移量
0 rmoveto %將圖龜移動到該點進行字符串顯示(目的為讓字符串顯示在logo的正中央)
(OMAHA) show } def
255 465 translate
background
moon
omaha
showpage
6.4、總結
repeat
重復執行程序n次
rotate
逆時針方向旋轉坐標系
scale
x,y方向縮放坐標系
translate
將坐標原點進行移動
grestore
恢復上一次保存的圖形狀態
gsave
保存當前圖形狀態
arc x y r ang1 ang2 -> —
逆時針添加圓弧
arcn x y r ang1 ang2 -> —
順時針添加圓弧
arcto x1 y1 x2 y2 r -> xt1 yt1 xt2 yt2
繪制圓弧,參數五個,兩點一個半徑,返回值為圓弧的起始點和終止點
currentpoint — -> x y
返回當前點的坐標
總結
以上是生活随笔為你收集整理的PostScript语言教程(六、图形变换)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux小菜鸟入门,《Linux菜鸟入
- 下一篇: Bootstrap Table 列参数c