1/26/07

4.3 連桿之種類

就與接頭之搭接情形而言,通常可分為雙接頭、參接頭及肆接頭或多接頭等。雙接頭在前面之連桿已經詳明,並且可以使用Matlab進行繪圖連接。多接頭之連結桿則是一種具有兩個以上之結點在同一個桿上。因此其形狀及外觀也特別與雙接頭桿不同。此節將設法介紹此類的桿型。

下面之程式為quatenary函數,可以輸入同一桿中之連結點位置(x0,y0),dd為各結之直徑,若為負值,表示需要繪圖。各點依序以在二維中最高點依反時針方向選取,因而可以得到正確的方位。

程式內容


此程式與前述之應用可以連結在一起,以獲得不同的機構表示法。不過,這個程式並不是最好的結果,讀者也許可以由此在研發更妥善的程式。此函數理論上可以處理許多點構成的多點桿,其結點之座標由(x0,y0)決定,因此它可以使用行陣表示,但必須一對一相互對應。dd為結孔之直徑。

每一結點之圓孔以dd為直徑,其座標利用linspacce(0,2*pi,60)以60點組成。基本上每一點均需由結之中心點開始,故這些座標必須相連接點出。其次決定外圍及內圍的線座標。


function [x,y]=quatenary(x0,y0,dd)
% Drawing for multiple links
% Inputs:
% x0,y0:coordinates of points,the points
% must be specified in counterclockwise.
% dd:dia. of circle
% Example
% [x,y]=quatenary([0.5 2 3 2],[1 3 2 0.5],-1);

nn=length(x0);d=abs(dd)/2;
th=linspace(0,2*pi,60);
xc=[0 d*cos(th) 0];yc=[0 d*sin(th) 0];
%collect the coordinates of all joint holes
x=[];y=[];
for i=1:nn,
x=[x x0(i)+xc];
y=[y y0(i)+yc];
end
x=[x x0(1)];y=[y y0(1)];
mx=mean(x0);my=mean(y0);r=1.3;
%find the outer coordinates
for i=1:nn,
x=[x (x0(i)-mx)*r+mx];
y=[y (y0(i)-my)*r+my];
end
x=[x (x0(1)-mx)*r+mx];
y=[y (y0(1)-my)*r+my];
if dd<0,patch(x,y,[.5 .5 .5]);axis equal;end


執行例



[x,y]=quatenary([0.5 2 3 2],[1 3 2 0.5],-0.1);




應用例



% demo4_1.m
clf;
quatenary([5 4 9],[6 2 5],-0.5);
anchor(-1,0,0,0);
linkxy([0 0],[2,5],-1);
linkxy([2 5],[5,6],-1);
linkxy([9 5],[8,3],-1);
linkxy([8 3],[10,0],-1);
anchor(-1,4,2,0);
anchor(-1,10,0,0);




Linkplate函數


上述繪製多結桿之函數,可以用另一函數改善,此函數稱為linkplate,其輸入及功能與quaternary函數相同,但外觀較佳。下面為此函數之內容:

程式內容


此程式之設計與前述之quaternary略有不同,它是利用複數型式進行向量之轉換,與前述之links函數之應用法相同。但其輸入項及內容與quaternary函數則完全相同。

function [x,y]=linkplate(x0,y0,dd)
% Drawing for multiple links
% Inputs:
% x0,y0:coordinates of points,the points
% must be specified in counterclockwise.
% dd:dia. of circle
% Example
% [x,y]=linkplate([0.5 2 3 2],[1 3 2 0.5],-1);
nn=length(x0);d=abs(dd)/2;
x0=x0(:);x2=[x0(2:end);x0(1)];
y0=y0(:);y2=[y0(2:end);y0(1)];
V=(x2-x0)+(y2-y0)*i;
D=abs(V);th=angle(V);
t=linspace(pi/2,2.5*pi,20);
Cout=max(d,0.2)*exp(j*t');Cin=Cout/2;
M=[];
for k=1:nn,
P=[Cin;Cout(1:10);D(k)+[Cout(11:20);Cin;Cout(20)]];
xx=real(P);yy=imag(P);tx=th(k);
x=xx*cos(tx)-yy*sin(tx)+x0(k);
y=xx*sin(tx)+yy*cos(tx)+y0(k);
if dd<0, line(x,y);end
end


執行例


前例亦可利用上面之函數執行,其指令及結果如下:

% demo4.m
clf;
linkplate([5 4 9],[6 2 5],-1);
anchor(-1,0,0,0);
linkxy([0 0],[2,5],-1);
linkxy([2 5],[5,6],-1);
linkxy([9 5],[8,3],-1);
linkxy([8 3],[10,0],-1);
anchor(-1,4,2,0);
anchor(-1,10,0,0);




另一執行例


此例包括滑塊、底座及多結桿等之應用,其指令檔及執行結果如下:

% demo5.m
clf;
anchor(-1,0,0,0);
linkxy([0 0],[1 2],-1);
linkxy([1 2],[6 3],-1);
linkplate([3 6 6],[6 3 7],-1);
linkxy([6 3],[8 0],-1);
anchor(-1,8,0,0);
linkxy([6 7],[8,9],-1);
anchor(-1,8,9,180);
linkxy([3 6],[-2,7],-1);
[x,y]=sldblk(-2,1.5,-2,7,-30);
ground(x(end-2),y(end-2),-2,-30);