2007年3月29日 星期四

機動學HW4


B94611023許惠善


本次作業二三僅要求畫出對應的相關位置,沒有明確表示是否要以動畫方式呈現,所以我的程式碼暫以「動畫」呈現,如果不想要以動畫呈現的話,分別在第二題的第7、第三題第8行(clf部分)行以及第二題28~34行第三題第30行處(pause部分)前,加上%使其變成註解方式,可自由改變是否以動態程式呈現,或是只要圖片亦可直接刪除上述程式碼。

另外我的螢幕因為是16:9的,所以圖形在動畫會跑得有點怪怪的,好像有點不合比例,不過我確定我的程式碼在別人電腦裡跑出來是正確無誤的。

以下為程式碼內容:

ANS1:



clf;

%宣告三角形邊長
L=23+10;

%宣告三角形的三個座標,為了回到原點我們必須對起點重複
Triangle=[0 0;L 0;L/2 (L.*3^0.5)./2;0 0];
%宣告另一個triangle,使我們可以暫存三角形的旋轉座標
triangle=Triangle;
%因為總共旋轉三次,所以使用for畫圖三次縮短程式碼
for i=1:1:3;

%本段的if i==2的部分是將第二個座標先移到原點做旋轉
%下一段i==2的部分是把座標在移回去原來對應的圖形
if(i==2);
Triangle(:,1)=Triangle(:,1)-L;
end;
%本段的if i==3的部分是將第三個座標先移到原點做旋轉
%特別要注意的是:
%但由於在第二個部分的時候我們先把Triangle(:,1)都向左移了L
%所以這部分我們只要移動向右L/2
%下一段i==2的部分是把座標在移回去原來對應的圖形
if(i==3)
Triangle(:,1)=Triangle(:,1)+L/2;
Triangle(:,2)=(Triangle(:,2)-(L.*3^0.5)./2);
end;
for theta=0:0.5:360;

%x座標旋轉
triangle(:,1)=Triangle(:,1)*cosd(theta)+Triangle(:,2)*sind(theta);

%y座標旋轉
triangle(:,2)=-Triangle(:,1)*sind(theta)+Triangle(:,2)*cosd(theta);

if(i==2);
triangle(:,1)=triangle(:,1)+L;
end;
if(i==3)
triangle(:,1)=triangle(:,1)+L/2;
triangle(:,2)=(triangle(:,2)+(L.*3^0.5)./2);
end;

axis equal;
axis ([-40 80 -40 80]);

%畫出三角形
line(triangle(:,1),triangle(:,2));

grid on;
hold on;

%使圖形暫停0.0001秒鐘,變成動畫
pause(0.0001);

%除了最後一個圖以外,我們都要清除原來的圖形,才會是動畫,
%為方便觀察每點第一圖停留較久,尤其第一點旋轉圖的第一途停留最久
if theta==0
pause(1.5);
if i==1
pause(5)
end
end
if i<3theta<360;
clf;
end;
end;
end;



Ans2:



%先訂出連桿的始點
L=[0 0;10 0];
%宣告一個變數以做旋轉
l=L;
%動畫從0度到360度每隔一度做變化
for theta=0:1:360;
clf;

%x座標旋轉
l(:,1)=L(:,1)*cosd(theta)+L(:,2)*sind(theta);

%y座標旋轉
l(:,2)=-L(:,1)*sind(theta)+L(:,2)*cosd(theta);

%呼叫lineshape函數繪圖
linkshape([l(1,1),l(1,2)],[l(2,1),l(2,2)],4);
hold on;

%畫出彈簧位置與連桿連結,為了讓圖形看起來比較清楚,特別將彈簧畫紅色,並在兩端做+記號
plot(15,0,'r+')
plot(l(2,1),l(2,2),'r+')
line([15,l(2,1)],[0,l(2,2)],'color','r');


axis ([-15 15 -15 15]);
grid on;

%為了讓圖形觀察容易,在初始值的時候停留一秒鐘
if theta==0;
pause(10)
end;

pause(0.001);
end;


Ans 3:



%先訂出連桿的始點
%A(0,0);B(3,4);C(13,4);D(10,0),
L=[0 0;3 4;13 4;10 0];
%宣告一個變數以做旋轉
l=L;
%動畫從0度到360度每隔一度做變化
for theta=0:30:360;
clf;

%首先僅需考慮主動軸
%x座標旋轉
l(2,1)=L(2,1)*cosd(theta)+L(2,2)*sind(theta);
%y座標旋轉
l(2,2)=-L(2,1)*sind(theta)+L(2,2)*cosd(theta);


%因為AB是主動軸,所以C點的位置會受到B點牽制,故XC=XB+10
l(3,1)=l(2,1)+10;
l(3,2)=l(2,2);

%呼叫lineshape函數繪圖
linkshape([l(1,1),l(1,2)],[l(2,1),l(2,2)],3);
linkshape([l(2,1),l(2,2)],[l(3,1),l(3,2)],2);
linkshape([l(3,1),l(3,2)],[l(4,1),l(4,2)],1.5);
linkshape([l(4,1),l(4,2)],[l(1,1),l(1,2)],2);
hold on;

axis ([-10 20 -15 15]);
grid on;
if theta==0;
pause(10);
end;
pause(0.8);
end;

1 則留言:

不留白老人 提到...

Good work! It would be better if you declare "axis equal" first to make sure the shape of link is right.