1/22/07

2.3 連桿外型之繪製

連桿之位置及其外觀設計如下圖。連桿兩端之中心點分別為AB,由此兩點界定連桿之尺寸。因此其兩點間之距離D為重要的因素。由於繪製連桿之外圍,必須利用line指令採用描線之方式。這裡所提出之描線方法與前節介紹之內容相同,是屬最簡單之方式。首先設連桿之厚度為d,兩端之外圓與內圓之半徑分別為d/2與d/4。其連線方式由左邊之A點開始,先往上走1,再繞左端之內圓,回到原端點時再往上走3。至外圓時往左走半圓4,經過5,與右邊之半圓6 ,至7往下再走內圓8,其次回到9往上,再往右沿10回到3,完成一線畫。



由於連桿係以平放的位置開始,實際上必須計算BA線段之角度,然後進行迴轉到所需要之位置。此時就必須利用第一章之座標轉移與迴轉,配合運用。

程式內容


為使任何連桿均能具有厚度,以及所需要之長度,程式linkshape就是一種函數寫法,並且主要能繪出連桿之外形。此函數之輸入有點A、B與d三項,分別為連桿之起點及終點座標及桿厚度。程式採用複數表示法,因此可以迅速計算其D值與傾斜角度。

在Matlab中,複數表示法有其特殊的性質,可以作為表示兩獨立座標之值。在複數表示法中,實數i的對應值可代表x軸之向量;而虛數j部份之值可代表y軸之向量,因此在二維的座標中,正好可以利用一個複數值代表一個座標點。其優點是Matlab中有指令如real()、imag()、abs()、angle()等函數可以分別處理實數、虛數、絕對值及角度等值,應用上有其方便之處。所以在linkshape之函數中,可以見證其應用的情形。

連桿AB間,其對應關係式可以轉換如下:

x = x'cos(th)-y'sin(th) +A(1)
y = y'sin(th)+y'cos(th) +A(2)

公式裡,th為其水平角度,A(1)與A(2)分別為起點A之座標值。程式內容如下:

function linkshape(A,B,dd)
% Draw a link
% Inputs:
% A,B:Initial & final coordinates of link
% d:thickness of link(negative for line link)
% Example: linkshape([0 0],[5,5])
if nargin==2,dd=1;end;
d=abs(dd);
AB=(B(1)+j*B(2))-(A(1)+j*A(2));
D=abs(AB);th=angle(AB);
t=linspace(pi/2,2.5*pi,20);
Cout=max(d/2,0.2)*exp(j*t');Cin=Cout/2;
if dd>0,
P=[0;Cin;Cout(1:10);D+Cout(11:20);D+Cin;D+Cout(20);Cout(1)];
else
P=[Cin;0;D;D+Cin];
end
xx=real(P);yy=imag(P);
x=xx*cos(th)-yy*sin(th)+A(1);
y=xx*sin(th)+yy*cos(th)+A(2);
line(x,y)
axis equal

執行例



>> linkshape([15 0],[0,0])
>> linkshape([15 0],[5,6])
>> linkshape([0 0],[5,6])




利用同樣的程式,試執行下列指令,看看會有什麼樣的結果。

>> linkshape([15 0],[0,0],-1)
>> linkshape([15 0],[5,6],-1)
>> linkshape([0 0],[5,6],-1)


設有一四連桿,其ABCD四點之座標分別為A(0,0);B(3,4);C(13,4);D(10,0),其單位為cm,若AD為固定桿,AB為第二桿BC與CD分別為第三與第四桿,各桿厚度分別為3,2,1,3cm。試繪出其相關位置。

若AB為主動迴轉桿,則其每間隔60度間之對應位置會如何?這可寫成一個執行檔如下:

linkshape([0 0],[10 0],3)
linkshape([0 0],[3 4],2)
linkshape([3 4],[13 4],1)
linkshape([13 4],[10 0],3)


請用help patch指令,查詢patch指令的用法,如何更改linkshape函數中之畫圖之顏色?