2007年4月10日 星期二

機動學第五次作業之一

p5-1.1

function arm1(L1,th1) %建立一個叫做arm1的函數
axis equal; %裡面有L1及th1分別代表上臂長和其轉動角度
for i=90:1:270 %大致上畫出肩膀的球窩關節
arm1upx=5*cosd(i); %量自己的手發現寬度的一半大約為五公分
arm1upy=5*sind(i);
arm1upx1=5*cosd(i)*cosd(-th1)-5*sind(i)*sind(-th1);
arm1upy1=5*cosd(i)*sind(-th1)+5*sind(i)*cosd(-th1);
line(arm1upx1,arm1upy1);
end;
for j=-90:1:90
arm1lowx=3*cosd(j)+L1; %這是手肘部分的關節
arm1lowy=3*sind(j); %與肩膀關節假設差不多,只是寬度不同
arm1lowx1=(3*cosd(j)+L1)*cosd(-th1)-3*sind(j)*sind(-th1);
arm1lowy1=(3*cosd(j)+L1)*sind(-th1)+3*sind(j)*cosd(-th1);
line(arm1lowx1,arm1lowy1);
end;
%分別寫出連接幾個點的
%X和Y座標,把手的部分
%跟上面關節的部分接起來
p1x=5*cosd(90)*cosd(-th1)-5*sind(90)*sind(-th1);
p1y=5*cosd(90)*sind(-th1)+5*sind(90)*cosd(-th1);
p2x=5*cosd(270)*cosd(-th1)-5*sind(270)*sind(-th1);
p2y=5*cosd(270)*sind(-th1)+5*sind(270)*cosd(-th1);
p3x=(3*cosd(-90)+L1)*cosd(-th1)-3*sind(-90)*sind(-th1);
p3y=(3*cosd(-90)+L1)*sind(-th1)+3*sind(-90)*cosd(-th1);
p4x=(3*cosd(90)+L1)*cosd(-th1)-3*sind(90)*sind(-th1);
p4y=(3*cosd(90)+L1)*sind(-th1)+3*sind(90)*cosd(-th1);

qua=[p1x p1y;p2x p2y;p3x p3y;p4x p4y;p1x p1y]; %一筆劃線
line(qua(:,1),qua(:,2));
function arm2(L1,L2,th1,th2) %這是下臂的函數
axis equal; %假設大致與上臂相同,比較不一樣的地方
for i=90:1:270 %在因為下臂必須跟手肘連接,所以要用到
arm2upx=3*cosd(i)+L1; %有關上臂的參數像L1,th1
arm2upy=3*sind(i);
arm2upx1=arm2upx*cosd(-th2)-arm2upy*sind(-th2);
arm2upy1=arm2upx*sind(-th2)+arm2upy*cosd(-th2);
line(arm2upx1,arm2upy1);%end;%for j=-90:1:90
arm2lowx=2*cosd(j)+L2+L1;
arm2lowy=2*sind(j);
arm2lowx1=arm2lowx*cosd(-th2)-arm2lowy*sind(-th2);
arm2lowy1=arm2lowx*sind(-th2)+arm2lowy*cosd(-th2);
line(arm2lowx1,arm2lowy1);
end;

p1x=(3*cosd(90)+L1)*cosd(-th1)-3*sind(90)*sind(-th1);
p1y=(3*cosd(90)+L1)*sind(-th1)+3*sind(90)*cosd(-th1);
p2x=(3*cosd(270)+L1)*cosd(-th1)-3*sind(270)*sind(-th1);
p2y=(3*cosd(270)+L1)*sind(-th1)+3*sind(270)*cosd(-th1);
p3x=(2.5*cosd(-90)+L2+L1)*cosd(-th1)-2.5*sind(-90)*sind(-th1);
p3y=(2.5*cosd(-90)+L2+L1)*sind(-th1)+2.5*sind(-90)*cosd(-th1);
p4x=(2.5*cosd(90)+L2+L1)*cosd(-th1)-2.5*sind(90)*sind(-th1);
p4y=(2.5*cosd(90)+L2+L1)*sind(-th1)+2.5*sind(90)*cosd(-th1);
qua=[p1x p1y;p2x p2y;p3x p3y;p4x p4y;p1x p1y];
%最後畫出下臂的外形

h=line(qua(:,1),qua(:,2));
rotate(h,[0 0 1],th2,[L1*cosd(-th1) L1*sind(-th1) 0])
%加了rotate就可以讓
%下臂繞著手肘旋轉

function palm(L1,L2,L3,th1,th2,th3) %手掌的函數
%手掌要跟下臂連接,所以起始點連接是
%手腕的部分
p1x=L1*cosd(-th1)+L2*cosd(-90+th2);
p1y=L1*sind(-th1)+L2*sind(-90+th2);
%大致上假設大拇指根部在1/3手掌長的地方
%其他描點大約都按照手掌比例而成
p2x=p1x+L3/3;
p2y=p1y;
p3x=p1x+2/3*L3;
p3y=p1y+L3/4;
p4x=p1x+L3/2;
p4y=p1y;
p5x=p1x+L3;
p5y=p1y;
p6x=p1x+L3;
p6y=p1y-1;
p7x=p1x+L3/2;
p7y=p1y-1;
p8x=p1x+L3/2;
p8y=p1y-1.3;
p9x=p1x+L3;
p9y=p1y-1.3;
p10x=p1x+L3;
p10y=p1y-2.3;
p11x=p1x+L3/2;
p11y=p1y-2.3;
p12x=p1x+L3/2;
p12y=p1y-2.6;
p13x=p1x+L3;
p13y=p1y-2.6;
p14x=p1x+L3;
p14y=p1y-3.6;
p15x=p1x+L3/2;
p15y=p1y-3.6;
p16x=p1x+L3/2;
p16y=p1y-3.9;
p17x=p1x+L3;
p17y=p1y-3.9;
p18x=p1x+L3;
p18y=p1y-5;
p19x=p1x;
p19y=p1y-5;
hand=[p1x p1y;p2x p2y;p3x p3y;p4x p4y;p5x p5y;p6x p6y;p7x p7y;p8x p8y;p9x p9y;p10x p10y;p11x p11y;p12x p12y;p13x p13y;p14x p14y;p15x p15y;p16x p16y;p17x p17y;p18x p18y;p19x p19y;p1x p1y];

h=line(hand(:,1),hand(:,2));
rotate(h,[0 0 1],th3,[p1x p1y 0])
%最後把線全部連起來
%同樣這個函數讓圖形旋轉
axis equal



p5-1.2

%一個body的函數要能畫出三部分,就要有對應的參數
%上臂只需要上臂長,自己旋轉的角度 下臂和手掌需要
%它們上面的function的參數,因為轉動會影響座標的變化
function body(L1,L2,L3,th1,th2,th3)
arm1(L1,th1);
arm2(L1,L2,th1,th2);
palm(L1,L2,L3,th1,th2,th3);

由於手掌及arm2的位置都會受到arm1的影響,所以其中所含有的變數必須包含前面的變數,例如L1,L2th1,th2等等



p5-1.3

由於手掌的角度不可能彎成作業平台上所示的-30度,所以我個人認為教授所敘述的應該是相對於arm2的30度,也就是以手往前延伸當作水平線來算,手掌往逆時針方向旋轉30度,如我認知錯誤,煩請教授指正


p5-1.4
我根據上一題的解釋,所畫出的人類手臂的轉動的模式


1 則留言:

不留白老人 提到...

程式請勿用空那麼大的行,結果仍然需要進一步分析