2007年3月31日 星期六

機動學 作業四

作業四 b94611042 王志豪
4-1

L=42+10;
%在此宣告三角形的邊長
axis equal;
AXIS([-110 110 -110 110])
%上面主要限制整個圖形在做運動時的座標範圍
x=[0 -1*L/2 L/2 0];
y=[(3)^(1/2)*L/2 0 0 (3)^(1/2)*L/2];
%以上為三點座標的一筆劃法,由於是一筆畫,故起點座標必須重複一次
a=line(x,y)
%繪圖
for n=1:180
rotate(a,[0 0 1],2,[L/2 0 0])
pause(0.002)
end
for n=1:180
rotate(a,[0 0 1],2,[0 (3)^(1/2)*(L)/2 0])
pause(0.002)
end
for n=1:180
rotate(a,[0 0 1],2,[-1*L/2 0 0])
pause(0.002)
end;
%在此,我使用for做迴圈,按題目要求,需分別對三頂點作旋轉,故重複使用三遍
%主要的原理是利用rotate達成旋轉一個物件的目的
%使用pause的意義在於擔心程式跑太快,肉眼無法跟上,故刻意減緩其速度以便觀察

4-2














4-2之圖
程式如下:
linkshape([10 0],[0,0],2)
%在此建立一個連桿的初始位置以及其寬度
a=10;
b=0;
x1=15;
y1=0;
for n=1:15:360;
x2=a*cosd(n);
y2=-a*sind(n);
%一樣是使用for迴圈來處理這個問題
%簡單來說,將360度的圓角度,每隔15度切割一次,作為旋轉的目的地的基準
%由於轉點為原點,故座標轉換就十分簡單了,利用sin和cos函數便可達到轉換座標的目的
linkshape([x2,y2], [0,0], 2)
line([x1,x2],[y1,y2]);
end
%當每個所欲旋轉所至之地點均確立後,做連線,此題即可解決

當中有使用到一個function如下:
function linkshape(A,B,dd)

if nargin==2,dd=1;end;
d=abs(dd);
AB=(B(1)+j*B(2))-(A(1)+j*A(2));
D=abs(AB);th=angle(AB);
t=linspace(pi/2,2.5*pi,20);
Cout=max(d/2,0.2)*exp(j*t');
Cin=Cout/2;
if dd>0,
P=[0;Cin;Cout(1:10);D+Cout(11:20);D+Cin;D+Cout(20);Cout(1)];
else P=[Cin;0;D;D+Cin];
end
xx=real(P);yy=imag(P);
x=xx*cos(th)-yy*sin(th)+A(1);
y=xx*sin(th)+yy*cos(th)+A(2);
line(x,y)
axis equal
%這個function摘自教學網站上的範例,可供我畫出一個漂亮的連桿圖

4-3














4-3之圖
程式如下:
a1=0;
a2=3;
a3=13;
a4=10;
b1=0;
b2=4;
b3=4;
b4=0;
linkshape([a2 b2],[a1,b1],2);
linkshape([a3 b3],[a2,b2],3);
linkshape([a4 b4],[a3,b3],1.5);
linkshape([a1 b1],[a4,b4],2);
%以上為確立四個連桿的初始位置
for n=0:30:360;
o=a2*cosd(n)+b2*sind(n);
p=-a2*sind(n)+b2*cosd(n);
q=a3+(o-a2);
r=p;
linkshape([o p],[a1,b1],2);
linkshape([q r],[o,p],3);
linkshape([a4 b4],[q,r],1.5);
linkshape([a1 b1],[a4,b4],2);
end;
%這題明顯是平行四邊形的變動,由於平行四邊形的各角之角度均可變化,而邊長全都維持
%當平行四邊形旋轉的時候,為了維持兩邊互相平行,故對面的連桿之x座標以及y座標得注意數值
%可先自行先在紙面上做圖得知,平行四邊形的旋轉,是兩兩各繞一點作旋轉
%所以把其中兩個座標丟入for迴圈後,開始座標變換,可得兩點之旋轉座標
%最後,開始調整,由於另兩點於這兩點成平行狀態,故可藉由平移的方式,求得其座標
%座標全部求出,用linkshape連線,得解,此題完畢

1 則留言:

不留白老人 提到...

如果你能解釋為何張志鵬同學的內容與你的答案及風格極為類似,我再考慮給你較高的評分,否則連張同學將列入黑名單之內。