2/16/07

9.1 滾動的車輪

滾動的車輪


要讓輪子能夠轉動,並且在一個平面上滾動,尚必須熟悉其他有關指令。在MATLAB中,並沒有繪圓的指令,雖然有做立體球之相關指令,但純為繪圓則必須自己寫。我們已經在MATLAB論壇中公佈了一個繪圓的指令:

>>circle(r, x0,y0)

實際上,圓之程式可以利用下列指令簡單完成:


xx=[r*cos(th) 0];yy=[r*sin(th) 0];


其中加上[0 0]這點圓心,主要目的是要加上一條半徑線,使圓之迴轉可以看得出來。圓型的物體在平面上滾動時,其行走之圓周長應等於前進之距離。周長為半徑與迴轉弧度之乘積。其運動之軌跡因此可以利用此一關係計算。

話說要使一個輪子在平面上滾動,其一輪子必須移動,其二輪子必須自轉。這兩個動作必須合併進行。前面已經談過,移動與轉動必須借助trans4這個函數指令,並且呼叫兩次。而每次的座標轉換,應先在原點上自轉後再將座標移動到需要的位置,如此才能使過程簡化。

程式內容


車輪滾動時,中間有一半徑作為指標。車輪由兩圓組成,其握把分別為h及h1,一為實線,一為虛線。使車輪有滾動的感覺。當車輪滾至兩端時,會返回,使其維持在同一平台上。

function rolling_wheel(r,v)
% circle motion
% Example: rolling_wheel(10,10)
clf;
ww=max(100,3*r);
axis([-r ww+r 0 r]);
axis equal;axis off;
ss=100/pi/3;
th=linspace(0,2*pi,120);
xx=[r*cos(th) 0];yy=[r*sin(th) 0];
line([-r ww+r]',[0 0]','linewidth',3,'color','b');
h=line('xdata',[],'ydata',[],'erasemode','xor',...
'linestyle','-.','linewidth',6,'color','r');
h1=line('xdata',[],'ydata',[],'color','b','linewidth',4);
title('Rolling Wheel (Press Ctl-C to stop)');
s=pi/120*v;sth=0;d=0;
while 1,
x=xx*cos(sth)-yy*sin(sth)+d;
y=xx*sin(sth)+yy*cos(sth)+r;
set(h1,'xdata',x,'ydata',y);
set(h,'xdata',x,'ydata',y);
sth=sth-s; d=-r*sth;
if sth>0|d>ww, s=-s;end;
drawnow;
pause(0.01);
end



執行結果




環內迴轉


除了在直線迴轉之情況下,亦可考慮在圓圈內迴轉時之情形如下:

function rolling_wheel2(r1,r2,v)
% circle motion
% Example: rolling_wheel2(15,30,1)
clf;
axis([-r2 r2 -r2 r2]);
axis equal;axis off;
ss=100/pi/3;
t0=linspace(0,2*pi,360);
h0=line(r2*cos(t0),r2*sin(t0),'linewidth',3,'color','b');
h=line('xdata',[],'ydata',[],'erasemode','xor',...
'linestyle','-.','linewidth',max(1,ceil(r1/5)),'color','r');
t1=linspace(0,2*pi,120);
xx=[r1*cos(t1) 0];yy=[r1*sin(t1) 0];
title('Press Ctl-C to stop');
s=pi/120*v;sth=0;th=0;

while 1,
dx=(r2-r1)*cos(th);
dy=(r2-r1)*sin(th);
x=xx*cos(sth)-yy*sin(sth)+dx;
y=xx*sin(sth)+yy*cos(sth)+dy;
set(h,'xdata',x,'ydata',y);
th=th-s;
sth=sth+s*r2/r1;
if sth>2*pi,sth=sth-2*pi;end
if th>2*pi,th=th-2*pi;end;
drawnow;
pause(0.01);
end

執行結果




由這個例子中,除了因桿長不同可以看出擺線的位置不同外,同學亦可思考其應用方向,例如:
  1. 將桿子(握把h1)變換為一個人的形式,會有什麼不同?
  2. 將n值作成n=3在地面上滾動時,會產生那些不合理的地方?若有應如何修正?
  3. 能否將平面改成一個已知的曲面,使圓輪在曲面內滾動?
  4. 如果圓輪與地面有打滑時(例如打滑率3%),則程式如何修正以反應此點?