2007年5月15日 星期二

HW9

B94611023 生機二 許惠善


我本週(5/3)有來上課。
詳細作業請參考我的部落格



本次作業我以課本的程式為基礎來作為分析。自己再寫了一支程式draw_slider,用來讓使用者將RLe三值輸入,程式就會自動跑其極限位置的動畫。

運用到的課本程式是slider_limit()以及slider_solve(),基本上對於slider_limit()這支程式碼並無做異動,所以我只放在作業最後供各位同學參考,可以試著在自己電腦跑跑看。

然而slider_solve我對其做了少許變更,可以由原本的程式看出,利用基本的三角關係,我們求出了滑塊所可移動的距離,然而以A點為座標原點的話,這個滑塊的移動距離其實就是其在座標平面上的x值,故在此利用座標x,y值皆求出來,以做圖形。


程碼如下式如下:

(1)draw_slider()
function draw_slider(R,L,e)

%將輸入帶入slider_limit()中計算,先求出其極限位置
%藉此我們就可以做出滑塊的運動動畫
[s theta1 theta2]=slider_limit(R,L,e)

%theta值只能介於theta1 theta2之間,所以for迴圈的上下線是theta1,theta2

for theta=theta1:1:theta2

%所以用thetax角做出一迴圈
%讓theta介於由slider_limit()所求出的兩個極限角中間
%然而不寫在同個for迴圈內,是因為希望B的軌跡可以一直就在圖上

for thetax=theta1:1:theta2%畫出驅動桿B點可走的軌跡

plot(R.*cosd(thetax),R.*sind(thetax),'r-','LineWidth',2)
axis ([-2 70 -2 35]);
grid on;
hold on;
end
%開始化滑塊運動的動畫,利用做更改後的slider_solve()做動畫
[d,theta3]=slider_solve(theta,R,L,e)
pause(0.01);
clf
end

(2)slider_solve()

function [d,theta3]=slider_solve(theta2,R,L,e,mode)
if nargin<5 mode="0;" d2g="pi/180;" theta="theta2*d2g;" cc="(e-R.*sin(theta))./L;">=0
theta3=asin(cc);
else
theta3=asin(-cc)*pi;
end
%由課本p 4-37圖4-21可見A B C三點的三角關係
d=L.*cos(theta3)+R.*cos(theta);


% B就是以A點為圓心,轉動theta角
text(0,0,'A')
hold on;
Bx=R.*cos(theta)
By=R.*sin(theta)
text(Bx,By,'B');
hold on;
plot([0 Bx],[0 By],'b-','LineWidth',2)
hold on;
plot(Bx,By,'ro');
hold on;

% C就是以B點為圓心,轉動theta3角
%但要記得我們一開始是以A點作為座標平面的原點
%所以別忘了把他加上Bx,By值做平移
%此處Cx其實就等於d,但因d為老師原有的程式,表示滑塊的水平距離,在此不做刪除

Cx=Bx+L.*cos(theta3)
Cy=By+L.*sin(theta3)
text(Cx,Cy,'C');
plot([Bx Cx],[By Cy],'k-','LineWidth',2)
hold on;
plot(Cx,Cy,'ro')
hold on;

%最後將theta3換回degree
theta3=theta3/d2g;


呼叫執行:

%R=10+23=33
%L=R+5=38
%e=10

draw_slider(33,38,10)
影片如下:


[附一]slider_limit()
function [s,theta21,theta22]=slider_limit(R,L,e)
d2g=pi/180;
th1=asin(e./(R+L));
th2=asin(e./abs(R-L));
s=(R+L).*cos(th1)-abs(R-L).*cos(th2);
theta21=th1/d2g;
theta22=th2/d2g;

3 則留言:

dragon 提到...

你的動畫之間的時間太長了吧-.-

許惠善 提到...

其實我設定的時間很短,但是因為我的RAM不夠,當我又跑程式又跑錄影就會便很慢,如果只有跑程式就不會有這種狀況,我應該會因為MATLAB去升級我的RAM吧XP
感謝指教!!

不留白老人 提到...

圖案有點變形,應加入axis equal改正