2/16/07

9.3 兩輪接觸滾動

兩輪接觸滾動,雖然在機動學中不常見,但其基本觀念則是齒輪的運動狀態。

這個範例所用到的程式函數與前面之單圓滾動之情形相同,但由於兩輪的直徑可能不同,兩輪的中心可以置於水平線上。表面上看來,這兩個輪子僅是作固定位置旋轉,不必作任何平移動作。實際則不然,因為座標的原點不可能放在兩個輪的軸心上,若然,亦僅能將其中一個置於原點,另一個還是要進行平移。

本題目係將座標置於兩輪之接觸點上,因此各輪均要平移與轉動。目前因為兩輪均是圓的,故轉動起來,即使採用座標轉動的變化也看不出來,當然投機取巧不讓它轉動也是可以的,但將來若表面是有齒輪面的話,也必須表現出來。

為使表現能夠明顯。因此在各輪上設有一個徑向把,可以看出其真正轉動情形。其初始動作如圖4所示。

這個函數有三個參數,前二者為二輪之半徑,後者為r1轉動的速度。

<3>程式內容
這個程式呼叫circle函數,也是繪圓,與前面的circ功能相同,也是屬不同的寫法。讀者可以印證其功能。兩主圓分別為h1及h2,分別使用藍色與紅色;且為突顯其轉動狀態,特別改用虛線。其次是利用h11與h21分別設定兩桿,注意各桿之兩端均有標記,其型式也是以圓圈。

控制兩圓迴轉之速度為s1與s2,其關係與兩圓之半徑有關,故可以利用下式計算:

theta1=theta1+s1;
theta2=theta2-s1*r1/r2;

程式內容


每個圓圈之迴轉則利用tans4這個副程式。這個程式內容在上一節中已經有討論過,可以參考。亦可自行撰寫簡單的程式應用。

function demo_mot7(R1,R2,v)
%demo_mot7.m
% Inputs:R1,R2:radius of two circles
% v: speed of rotation
%Two matched cicles in motion
% Example: demo_mot7(50,100,2)
%Author:DS Fon, Bime. NTU Date: Jan. 24, 2007
if nargin==0,R1=50;R2=100;v=100;end
clf;
r1=min(abs(R1),abs(R2));
r2=max(abs(R1),abs(R2));
height=max(r1,r2)*1.5;
axis([-2.5*r1 2.4*r2 -height height]);
axis image;axis off;
line([-2*r1 2*r2]',[0 0]','color','k',...
'linewidth',1,'linestyle','-.'); %The ground line
circle(r1/4,r2,0,10);circle(r1/4,-r1,0,10);
h1=circle(r1,0,0); %Draw the 1st circle of radius r1
h2=circle(r2,0,0); %Draw the 2nd circle of radius r2
h11=line([0 r1]',[0 0]','erasemode','xor','color','b',...
'linewidth',4,'marker','o','markersize',8); %Rod 1
h21=line([0 -r2]',[0 0]','erasemode','xor','color','r',...
'linewidth',8,'marker','o','markersize',16); %Rod 2
hold on;
%Get coordinates (x1,y1) & (x2,y2) of both circles
x1=get(h1,'xdata');y1=get(h1,'ydata');
x2=get(h2,'xdata');y2=get(h2,'ydata');
x11=get(h11,'xdata');y11=get(h11,'ydata');% rod 1
x21=get(h21,'xdata');y21=get(h21,'ydata');% rod 2
set(h1,'EraseMode','xor','color','b',...
'linewidth',1,'linestyle','-.')
set(h2,'EraseMode','xor','color','r',...
'linewidth',2,'linestyle','-.')
grid on;
title('Press Ctl-C to stop');
theta1=0;theta2=0;s1=v*pi/20;
while 1,
drawnow;
pause(0.1);
theta1=theta1+s1;
theta2=theta2-s1*r1/r2;
z1=trans4([x1',y1'],theta1,5);%rotate circle 1
z1=trans4(z1,[-r1 0],1);%translate circle 1
z2=trans4([x2',y2'],theta2,5);%rotate circle 2
z2=trans4(z2,[r2 0],1);%translate circle 2 to (r2,0)
z11=trans4([x11',y11'],theta1,5);%rotate rod 1
z11=trans4(z11,[-r1 0],1);%translate rod 1 to (-r1,0)
z21=trans4([x21',y21'],theta2,5);%rotate rod 2
z21=trans4(z21,[r2 0],1);%translate rod 2 to (r2,0)
set(h1,'xdata',z1(:,1),'ydata',z1(:,2)); % circle 1 data
set(h2,'xdata',z2(:,1),'ydata',z2(:,2)); % Circle 2 data
set(h11,'xdata',z11(:,1),'ydata',z11(:,2)); % Rod 1
set(h21,'xdata',z21(:,1),'ydata',z21(:,2)); % Rod 2
if theta1>2*pi,theta1=theta1-2*pi;s1=-s1;end;
end

function h = circle(r,x0,y0,nn)
% The inputs:
% r = radius of circle
% x0, y0= coordinates of the circular center
% Example: circle(10,0,0,10)
if nargin==3,nn=50;end;
t=0:2*pi/nn:2*pi;
h=line(x0+r*cos(t),y0+r*sin(t));


執行結果





看看這個例子,同學可以思考未來還可加一些什麼,因為可用的指令都有了。想一想較困難的吧,諸如:

  1. 把一個人字形的人圖像放在圓圈中央,讓它耍把戯。
  2. 試著在輪外圍加上齒輪的外形,其外形僅作一個就好,其餘用轉動拷貝的,如此就可以作成實際的齒輪動作了。
  3. 能否加上第三個輪,其變換方向又有不同。
  4. 能否作一個齒輪組。
  5. 不知將圓輪變成多角形時會怎樣?