網路城邦
上一篇 回創作列表 下一篇   字體:
MetaPost語言﹣座標、向量型態的運算元(pair operators)
2013/07/08 16:27:31瀏覽246|回應0|推薦1

pair是坐標或向量,內含二個數值。使用方法:

pair p; 宣告變數p為pair。

pair p[]; 宣告變數陣列p[]為pair,p[]為p0, p1....., P[n]的集合。n可以為任何數值0.15也行。

要給 p賦值的方法有二:一是用等式直接賦值,如:

p=(9,2);%不能用p:=(9,2);

另一種就是分別把對應的x,y座標值輪入。pair的內容值分成xpart p, ypart p:

xpart p=9; 或是 xpart p:=9;

ypart p=2; 或是 ypart p:=9;

MataPost特別定義了z為pair的宏(Marco):

vardef z@#=(x@#,y@#) enddef;

這樣把z開頭的後綴(suffixes)變數名稱直接定義成為pair型態,而且其內值可以用(x,y)直接使用。

如z1=(x1,y1); z.b=(x.b, y.b);...

而xpart z1 = x1; ypart z1= y1; x1, y1可以直接用來運算。這使用上就方便很多,不需要使用 xpart z1 等運算式來算值。

另外,可以使用中括號[]來運算二個pair所形成的直線中的某一點的值:

如p1, p2為 pair變數,則p3為p1,p2的中點:

p3=1/2[p1,p2];

就是 p3=p1+1/2(p2-p1);的意思。如果z1,z2二點線段和另外z3,z4二點的線段不平行,則這二條線的交點為:

z5=whatever[z1,z2]=whatever[z3,z4]; whatever表示一個任意數,這句程式的二個whatever分別是不同的值。

最簡單的例例子,就是畫三角形,並標示其重心G:

向量之間可以加減,乘除只能和數值。記得中間的單位問題,要注意使用。MetaPost提供了一些有用的運算元,對pair來作運算:

angle 用來算角度,如果是a,b,c為三個點,則a角平分線的角度,則是:

1/2*angle(b-a) +1/2*angle(c-a)

dir 是算某角度的單位向量。這在做圖時很方便,如正六邊形,如

path p;

for i=0 upto 5: z[i]=dir(60*i); endfor

p=z0--z1--z2--z3--z4--z5--cycle;

unitvector則是提供了長度1bp的單位向量。這是很重要的,因為MetaPost的數值的基本單位是bp, 而我們常的的單位可能是cm,1cm=28.34645bp。所以如果對向量也好,座標的運算也好,在相乘時如果長度單位沒注意,很容易出問題。如1cm X 1cm,結果會是28.34645cm。而1bp x 1cm 的結果才會是 1cm。unitvector這個運算元,可以把一個向量的單度單位消除成為單位向量,方便繪圖運算。

dotprod是算二向量的點積,這在算垂直的線段是很方便,用這個例子做為本章的結尾,a,b二向量,求a向量在b向量上的投影:

pair a,b,c; a=(20,80); b=(60,15);

c=whatever[(0,0), b];

(a-c) dotprod b=0;

這樣子,c點就會算好了,c點就是a向量在b向量上面的投影。

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

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