2007年3月22日 星期四

Homework 4

作業四 b94611001 歐陽太閒
%作業4.1 b94611001 歐陽太閒
%結果影片
%結果圖片
clf; %清除畫面
axis equal; %座標等比
axis([-len len*3 -len len]*3); %固定座標系
title('按 ctrl+c結束 作者:歐陽太閒 b94611001 L=1+10'); %資訊
d2r=pi/180; %角徑轉換
cirr=pi*2; %圓周
L=10+1; %邊長=學號+10
triMat1=[0 0;L/2 0;0 len*sin(60*d2r);-L/2 0;0 0] %正三角矩陣
delayTime= 0.1 %延遲時間
ang1=0;
rotAng=10*d2r; %旋轉角速度
tri1=line(triMat1(:,1)-len/2,triMat1(:,2),'erasemode','xor','color','r','linewidth',1); %對右頂點旋轉
tri2=line(triMat1(:,1)+len/2,triMat1(:,2),'erasemode','xor','color','b','linewidth',1); %對左頂點旋轉
tri3=line(triMat1(:,1),triMat1(:,2)-L*sin(60*d2r),'erasemode','xor','color','g','linewidth',1); %對上頂點旋轉
x1=get(tri1,'xdata');y1=get(tri1,'ydata'); %x,y座標擷取
x3=get(tri2,'xdata');y3=get(tri2,'ydata');
x5=get(tri3,'xdata');y5=get(tri3,'ydata');
while 1
pause(delayTime); %設定延遲時間
ang1=ang1+rotAng;
x2=x1*cos(ang1)-y1*sin(ang1); %旋轉平移
y2=x1*sin(ang1)+y1*cos(ang1);
x4=x3*cos(ang1)-y3*sin(ang1)+L*3;
y4=x3*sin(ang1)+y3*cos(ang1);
x6=x5*cos(ang1)-y5*sin(ang1)+L*6;
y6=x5*sin(ang1)+y5*cos(ang1);
set(tri1,'xdata',x2,'ydata',y2);
set(tri2,'xdata',x4,'ydata',y4);
set(tri3,'xdata',x6,'ydata',y6);
if ang1>cirr
ang1=ang1-2*cirr;
end; %if結束
drawnow; %繪製
end %while結束

%作業4.1程式碼結束
%---------------------------------------
%作業4.2 b94611001 歐陽太閒
%結果圖片
clf; %清除畫面
axis equal; %座標等比
title('作業4.2 作者:歐陽太閒 b94611001 藍粗線為彈簧 單位:cm'); %資訊
xlabel('x-axis');
ylabel('y-axis');
d2r=pi/180;
%%%%%%%%桿%%%%%%%%
thick=4; %厚度
p1=[0 0]; %桿的長度及座標
p2=[10,0];
disX=(p1(1)-p2(1)); %x距離
disY=(p1(2)-p2(2)); %y距離
disAbs= ((abs(disX)^2+abs(disY)^2))^0.5 %試寫非複數版
disAng=atan(abs(disY/disX));
t=linspace(pi/2,2.5*pi,20); %產生一20個元素的向量自90deg至450deg
Xc=(thick/2)*cos(t'); %分開處理
Yc=(thick/2)*sin(t');
Xcs=Xc/2;
Ycs=Yc/2;
Xarr=[0;Xcs;Xc(1:10);disAbs+Xc(11:20);disAbs+Xcs;disAbs+Xc(20);Xc(1)]; %桿的各點矩陣
Yarr=[0;Ycs;Yc(1:10);Yc(11:20);Ycs;Yc(20);Yc(1)];
x2=Xarr; %教授的複數版的確簡潔許多
y2=Yarr;

for i=0:30:360 %桿繞一圈
angR=i*d2r;
xl=x2*cos(angR)-y2*sin(angR)+p1(1); %旋轉
yl=x2*sin(angR)+y2*cos(angR)+p2(2);
xs=p2(1)*cos(angR)-p2(2)*sin(angR)+p1(1); %處理端點
ys=p2(1)*sin(angR)+p2(2)*cos(angR)+p2(2);
link1=line(xl,yl,'color','r'); %繪製
%%%%%%%%彈簧%%%%%%%%
spring = line([15 xs],[0 ys],'linewidth',4);
end %結束
%作業4.2程式碼結束
%---------------------------------------
%作業4.3有兩種轉法
%結果四連桿相關位置
%結果每30deg軌跡(1)
%結果每30deg軌跡(2)
%結果影片

%作業4.3.1 b94611001 歐陽太閒

clf; %清除畫面
axis equal; %座標等比
title('作業4.3.2 第一種轉法 作者:歐陽太閒 b94611001 單位:cm'); %資訊
xlabel('x-axis');
ylabel('y-axis');
axis([-10 20 -8 8]); %固定座標系
d2r=pi/180; %轉換
%A(0,0);B(3,4);C(13,4);D(10,0),2cm,3cm,1.5cm,2cm
len=[10 5 10 5];
thickArr=[3 1.5 2 2];
linksArrXo=[0 3 13 10 0];
linksArrYo=[0 4 4 0 0];
linksArrX=linksArrXo;
linksArrY=linksArrYo;
for j=0:30:360 %不同角度
p1=[linksArrX(1) linksArrY(1)];
for i=1:1:4 %繪連桿
thick=thickArr(i); %厚度
p1=[linksArrX(i) linksArrY(i)]; %桿的長度及座標
p2=[linksArrX(i+1) linksArrY(i+1)];
disX=(p2(1)-p1(1)); %x距離
disY=(p2(2)-p1(2)); %y距離
if disX==0;
disAng=-pi/2;
p2(2)=-p2(2);
else
if linksArrY(i+1)-linksArrY(i)>0 %處理下彎
disAng=atan(disY/disX);
else
disAng=-atan(disY/disX);
end
if linksArrX(i+1)-linksArrX(i)>0 %處理向左
disAng=atan(disY/disX);
else
disAng=atan(disY/disX) + pi;
end
end
disAbs= ((disX)^2+(disY)^2)^0.5; %試寫非複數版
t=linspace(pi/2,2.5*pi,20); %產生一20個元素的向量自90deg至450deg
Xc=(thick/2)*cos(t'); %分開處理
Yc=(thick/2)*sin(t');
Xcs=Xc/2;
Ycs=Yc/2;
Xarr=[0;Xcs;Xc(1:10);disAbs+Xc(11:20);disAbs+Xcs;disAbs+Xc(20);Xc(1)]; %桿的各點矩陣
Yarr=[0;Ycs;Yc(1:10);Yc(11:20);Ycs;Yc(20);Yc(1)];
x2=Xarr;
y2=Yarr;
xl=x2*cos(disAng)-y2*sin(disAng)+p1(1); %旋轉
yl=x2*sin(disAng)+y2*cos(disAng)+p1(2);
xs=p2(1)*cos(disAng)-p2(2)*sin(disAng); %處理端點
ys=p2(1)*sin(disAng)+p2(2)*cos(disAng);
link11=line(xl,yl,'color','r'); %繪製

end %連桿繪製結束
%計算每轉30deg時角度
angR=j*d2r;
len2=len.^2;
Bx=len(2)*cos(angR);
By=len(2)*sin(angR);
Cy=By
Cx=Bx+len(3);
linksArrX=[0 Bx Cx 10 0];
linksArrY=[0 By Cy 0 0];
pause(1) %動態軌跡
end %轉動結束
%4.3程式碼結束
%---------------------------------------
%作業4.3.2第二種轉法 b94611001 歐陽太閒
clf; %清除畫面
axis equal; %座標等比
title('作業4.3 作者:歐陽太閒 b94611001 單位:cm'); %資訊
xlabel('x-axis');
ylabel('y-axis');
axis([-10 20 -8 8]); %固定座標系
d2r=pi/180; %轉換
%A(0,0);B(3,4);C(13,4);D(10,0),2cm,3cm,1.5cm,2cm
len=[10 5 10 5];
thickArr=[3 1.5 2 2];
linksArrXo=[0 3 13 10 0];
linksArrYo=[0 4 4 0 0];
linksArrX=linksArrXo;
linksArrY=linksArrYo;
for j=0:30:360 %不同角度
p1=[linksArrX(1) linksArrY(1)];
for i=1:1:4 %繪連桿
thick=thickArr(i); %厚度
p1=[linksArrX(i) linksArrY(i)]; %桿的長度及座標
p2=[linksArrX(i+1) linksArrY(i+1)];
disX=(p2(1)-p1(1)); %x距離
disY=(p2(2)-p1(2)); %y距離
if disX==0;
disAng=-pi/2;
p2(2)=-p2(2);
else
if linksArrY(i+1)-linksArrY(i)>0 %處理下彎
disAng=atan(disY/disX);
else
disAng=-atan(disY/disX);
end
if linksArrX(i+1)-linksArrX(i)>0 %處理向左
disAng=atan(disY/disX);
else
disAng=atan(disY/disX) + pi;
end
end
disAbs= ((disX)^2+(disY)^2)^0.5; %試寫非複數版
t=linspace(pi/2,2.5*pi,20); %產生一20個元素的向量自90deg至450deg
Xc=(thick/2)*cos(t'); %分開處理
Yc=(thick/2)*sin(t');
Xcs=Xc/2;
Ycs=Yc/2;
Xarr=[0;Xcs;Xc(1:10);disAbs+Xc(11:20);disAbs+Xcs;disAbs+Xc(20);Xc(1)]; %桿的各點矩陣
Yarr=[0;Ycs;Yc(1:10);Yc(11:20);Ycs;Yc(20);Yc(1)];
x2=Xarr;
y2=Yarr;
xl=x2*cos(disAng)-y2*sin(disAng)+p1(1); %旋轉
yl=x2*sin(disAng)+y2*cos(disAng)+p1(2);
xs=p2(1)*cos(disAng)-p2(2)*sin(disAng); %處理端點
ys=p2(1)*sin(disAng)+p2(2)*cos(disAng);
link11=line(xl,yl,'color','r'); %繪製

end %連桿繪製結束
%計算每轉30deg時角度,參考教授著機動學課本-四連桿運動
angR=j*d2r;
len2=len.^2;
Bx=len(2)*cos(angR);
By=len(2)*sin(angR);
item1=(len(4)^2-len(3)^2-len(1)^2+len(2)^2)./(Bx-len(1))/2;
item2=By./(Bx-len(1));
rslt=(((item1-len(1))^2).*item2^2-(item2^2+1).*(item2-len(4)^2))^0.5;
Cy=((item1-len(1)).*item2+rslt)./(item2^2+1);
Cx=item1-item2.*Cy;
linksArrX=[0 Bx Cx 10 0];
linksArrY=[0 By Cy 0 0];
pause(1) %動態軌跡
end %轉動結束
%4.3程式碼結束

4 則留言:

不留白老人 提到...

作業之三項最好使用大標題分別,以免所有內容混在一起。
說明內容還是另文成段,程式則用 <pre></pre>括出比較清楚。
動畫已經使用影音檔,相當不錯,但所用的軟體好像解析度不夠,不妨使用camstudio看看。參看作業四精華篇。

th86 提到...

感謝教授的指導

b94611024 提到...

哈囉我是卓奕諺
來參觀一下你的部落格
標題很特別喔
多多指教

th86 提到...

哈哈感謝啦