作業四  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看看。參看作業四精華篇。
馮
感謝教授的指導
哈囉我是卓奕諺
來參觀一下你的部落格
標題很特別喔
多多指教
哈哈感謝啦
張貼留言