日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

PostScript语言教程(六、图形变换)

發布時間:2023/12/19 综合教程 21 生活家
生活随笔 收集整理的這篇文章主要介紹了 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语言教程(六、图形变换)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。