網路城邦
上一篇 回創作列表 下一篇   字體:
MetaPost語言﹣Transform 相關運算元
2013/07/05 18:30:03瀏覽305|回應0|推薦1

在介紹MetaPost變數型態時,Transform是其一種型態,其內容是幾何學上面的仿射變換。如要使圖形進行變換,則是使用 transformed 來執行。

MetaPost 裡面也有其他易掌握的變形指令,如 rotated,shifted, scaled, xsxaled, yscaled, rotated, zscaled等等,這些指令也可視為運算元,它們都是二元運算元,其使用規則,如下表:

這些指令的運算,都涉及到向量的運算,所以其單位要注意。因為MetaPost的長度單位是bp(1bp=1.00375pt =0.003528cm),所以如果沒有指定長度單位,則會是以bp的值在計算。就算是以cm來計算,它還是把cm轉換成bp值再計算。

這就容易出現問題。尤其在scaled等會有相乘的運算上面。(x,y) scaled a 的運算結果是 (ax, ay); 當(1cm, 1cm) scaled (1cm); 結果會是(28.34645cm,28.34645cm),因為是以 bp在計算的原因,所以圖形會放大28.34645平方倍,八百多倍。

因此在做這類運算時,要注意單位問題。有一個簡單的方法,就是使用unitvector,這個運算元可以把一個有單位pair值轉變成基本值的pair值,也就是說,unitvector(3u, 5u)=(0.5145, 0.8575)(長度為1bp的同向的單位向量)。而(0.5145,0.8575) scaled 1cm的結果就會是(3cm, 5cm);這樣才能確保計算的正確性。

rotated就是旋轉,如果某圖形想要讓它旋轉,要注意它是否在原點上。

shifted就是移動。

如果想要讓圖形a繞著(1,1)旋轉20度,可以

a shifted -(1,1) rotated 20 shifted (1,1);

這些運算元交互使用不會出現錯誤,因為他們的資料型態不會改變資料型態。如果混用了withpen, withcolor,那可能會出現問題。

draw a shifted (2,5) rotated 30 withcolor red; 這可以

draw a shifted (2.5) withcolor red rotated 30; 這樣不行。

transform資料型態的內容值,除了可以由三點轉換求值以外,也可以使用identity的transform專用的運算指令來求值:如果要把圖形進行zscaled -1 rotated 20 shifted (1cm,1cm)的效果,則可以用:

transform t;

t=identity xscaled -1 rotated 20 shifted (1cm, 1cm);

這樣也可以求得t值。

zscaled比較難以理解,它可以看成是同時進行縮放和旋轉的指令。一些做圖上需要如標示直角時很常用。

( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=paraquat&aid=7882722