B题 创意折叠桌
摘要
为了节省室内存放空间,方便人们的生活,某公司生产了一种可折叠并且可随着铰链活动平摊成平板的圆形桌子。桌子的桌腿由两组分别用一条钢筋连接的若干根木条组成,钢筋两端分别固定在桌腿各组最外侧的两根木条上,并且沿木条有空槽以保证滑动的自由度。
针对问题一,本文通过对所给的图片以及视频的分析,根据创意折叠桌的对
1称性,我们选定三维空间中桌体的为研究对象,从其投影入手,将其转化到二
4维平面中,采用数形结合的方法,构造直角坐标系,以最外侧木条旋转后与桌平面的夹角?为变量,把在折叠过程中各木条端点的位置放到坐标系中,分析各变量间的关系,从而建立数学模型。运用MATLAB软件编程,得到每个木条的开槽长度和桌角边缘线的运动轨迹。
针对问题二,要求折叠桌的设计应做到产品稳固性好、加工方便、用材最少。我们将最外侧木条旋转后与桌平面的夹角?和最外侧木条的钢筋固定位置距桌腿与地面接触点的长度x作为变量进行分析。首先,物体的稳固性(稳度)与其重心的高度、支撑面的面积有关,重心越低,稳度越高;支撑面的面积越大,稳度越高。其次,开槽的总长度决定了工作量和操作难度,开槽的总长度越长,操作越不便,坚固性越不好。最后,在不考虑材料厚度的情况下,由于折叠桌的宽度等于圆形桌面直径符合实际情况,所以长方形平板材料的多少取决于它的长度,长方形平板越短,所需的材料就越少。根据上述3个影响因素,我们使用多目标最优化模型,运用MATLAB编程求解创意折叠桌的最优化参数。在该模型中,我们设立了三个变量w1,w2,w3分别代表木材总长度,稳定系数(支撑面与桌面面积之差的平方)以及总开槽长度,通过分析相关限定条件进行建立模型与求解。从所得的结果来看,该模型基本准确。
针对问题三,除了考虑桌高,还要求考虑桌面边缘线的形状和大小以及桌脚边缘线的形状。为了描述桌面边缘线的形状和大小,我们规定了几个常见的形状及其属性(如,长,宽,半径,对角线长度等)。在给定桌面边缘线的形状和大小后,按照问题一的思路,寻找木材总长度w1,稳定系数w2以及总开槽长度w3与
?和x的关系以及变量的限定条件,建立多目标最优化模型,求解最优的?和x值。绘制动态图时,将利用问题一求得的木条端点随?变化的动态坐标进行绘制。
本文给出了圆形桌面、正方形桌面、菱形桌面的GIF格式的动画。
【关键字】创意折叠桌MATLAB多目标最优化模型稳度
1
一、问题重述
问题背景
某公司生产一种可折叠的桌子,桌面呈圆形,。桌腿由若干根木条组成,分成两组,每组各用一根钢筋将木条连接,钢筋两端分别固定在桌腿各组最外侧的两根木条上,并且沿木条有空槽以保证滑动的自由度。使得桌腿可随着铰链的活动平摊成一张平板,从而大大节省了存放空间。
问题提出
根据创意折叠桌的结构试建立数学模型讨论下列问题:
1. 给定长方形平板尺寸为120cm?50cm?3cm,每根木条宽2.5cm,连接桌腿木条的钢筋固定在桌腿最外侧木条的中心位置,折叠后桌子的高度为53cm。试建立模型描述此折叠桌的动态变化过程,桌腿木条开槽的长度和桌脚边缘线的运动轨迹。
2. 折叠桌的设计应做到产品稳固性好、加工方便、用材最少。对于任意给定的折叠桌高度和圆形桌面直径的设计要求,讨论长方形平板材料和折叠桌的最优设计加工参数,例如,平板尺寸、钢筋位置、开槽长度等。对于桌高70cm,桌面直径80cm的情形,确定最优设计加工参数。
3. 公司计划开发一种折叠桌设计软件,客户任意设定的折叠桌高度、桌面边缘线的形状大小和桌脚边缘线的大致形状,给出所需平板材料的形状尺寸和切实可行的最优设计加工参数,使得生产的折叠桌尽可能接近客户所期望的形状。你们团队的任务是帮助给出这一软件设计的数学模型,并根据所建立的模型给出几个你们自己设计的创意平板折叠桌。要求给出相应的设计加工参数,画出至少8张动态变化过程的示意图。
二、模型假设
1.桌腿倾斜时,由其厚度引起的误差对实际桌高没影响,可以忽略其厚度。 2.讨论桌面面积时,按圆面考虑。
3.圆桌面与木条接触边缘的中点代表桌面上对应的点。
4.钢筋对问题分析影响不大,可以近似看作一条直线段,将钢筋与各木条的接触位置看作点。
2
三、符号说明
符号 符号表示 木板两条长边中点的连线,它穿过圆形桌面的中心 木板两条长边中点的连线,它穿过圆形桌面的中心 桌面相对于地面的高度 Ld li h ? l1旋转后与高线h的夹角 l1旋转后与桌平面的夹角 圆形桌面的半径 ? r 注:其它未给出符号在题中会说明
四、模型建立与求解
本题主要研究了折叠桌的动态变化过程和设计折叠桌的加工参数。首先,我们需要建立模型描述此折叠桌的动态变化过程并给出此折叠桌的设计加工参数和桌脚边缘线的数学描述。其次,为了实现产品稳固性好、加工方便、用材最少,需要讨论长方形平板材料和折叠桌的最优设计加工参数。最后,建立相关数学模型,给出自己所设计的创意平板折叠桌并画出8张动态变化过程的示意图。
4.1问题一的模型建立与求解
1针对问题一,基于折叠桌的对称性,我们取其为研究对象,根据假设1,
4我们忽略桌腿的厚度。最外侧木条经过旋转达到预定高h后,第i(i?1,2,3,?,10)根木条与最外侧木条的位置关系的主视图如图1所示。
3
Bci biαEaCD桌面Aθh图1
我们将运用数形结合的方法,构造直角坐标系,建立出数学模型,以?(l1旋转后与桌平面的夹角)为变量,研究各木条端点Di的坐标(xi(?),yi(?),zi(?))的变化,描述了折叠桌的动态变化过程,进一步通过MATLAB编程,计算出此折叠桌的桌腿木条开槽的长度。
4.1.1模型的建立
因创意折叠桌的对称性,本组成员选定桌体的14为研究对象。图1为简化后的桌体主视图。
我们以桌面中心为原点O,沿木条方向为y轴,垂直于圆面且过原点的直线
z轴,Ld所在直线为x轴,建立空间直角坐标系。图1-1和图1-2为不同情况下
此坐标系在ZOY面的投影。
zoAFHBbiyaciCdiD(yi,zi)
图1-1
4
点A到Ld的距离为
1*l1?r2?(r?d)2
2
AC为最外侧木板长的一半,其长为
1202?l1a?2
则?的上限应该为?max?故???0,?max?。
圆桌面上第i根木板相对于最外侧木板多出来的长度为
1??bi?r??r?(i?)d?
2? (1.1)?在?ABC中应用余弦定理,有
22*?2?arccosh2a ,
a2?bi?ci(?) cos??2abi (1.2)
22可得第i根木板上钢筋与桌面接触点C的长度为
ci(?)?a2?bi?2abicos?;
2钢筋在第i根木板中卡槽移动的距离为
ei(?)?bi?ci(?)?a (1.3)
显然RtΔBFD与RtΔBHC相似,根据三角形相似定理,有
ci(?)a?sin??ci(?)?di(?)?zi(?) (1.4)
因为折叠桌折叠前,即??0时,各木条端点Di到Ld的距离相等,故有等式
l1?2a?l1?bi?ci(?)?di(?) (1.5)
成立。
化简可得
**
5
zi(?)??a?sin??(2a?bi)
ci(?) (1.6)
如图1-1和图1-2?ABC会对Di的坐标yi产生影响,分两类讨论(1)当?ABC??2时,B与C的y轴坐标应满足
acos??l1?bi?l1即
acos??bi**
2在三角形中由勾股定理可得
yi(?)?bi?l1?(2a?bi)2?zi(?)* (1.7)
(2)当?ABC?
zo?2时,如图1-2所示,
AbiBciHFyaCdiD(yi,zi)图1-2
此时,有acos??bi 在三角形中由勾股定理可得
yi(?)?bi?l1?(2a?bi)2?zi(?)*2
另外,第i根木条在旋转过程中横坐标
xi保持不变,恒为
1xi??(10?i?)d2
故第i根木条的端点Di的坐标为(xi,yi(?),zi(?)),钢筋在第i?1,2,?10根木
6
h]22a。
现在将这10根木条按照下面的对称公式,计算出与之对称的10根木条端点的坐标和ei(?)
。
板中卡槽移动的距离ei(?)?bi?ci(?)?a,??[0,??arccos?1?xi??(10?i?)d2??yi(?)?y21?i(?)?zi(?)?z21?i(?)??ei(?)?e21?i(?)4.1.2模型求解
当最外侧旋转角度达到
i?11,12,?,20
???2?arccoshei(?)2a时,每个都将达到最大值。
代入,利用附录中程序2,可求得每根木条上的开槽长度如表
木条序号 开槽长度 木条序号 开槽长度 木条序号 开槽长度 木条序号 开槽长度
每根木条的组成情况如图1-3
1 0 6 14.3930 11 17.8728 16 12.5926 表1 每根木条上的开槽长度 2 3 4.3564 7 15.8031 12 17.5314 17 10.3684 7.6637 8 16.8445 13 16.8445 18 7.6637 4 10.3684 9 17.5314 14 15.8031 19 4.3564 5 12.5926 10 17.8728 15 14.3930 20 0 ?
7
木条的组成情况60各木条开槽之外的部分各木条开槽部分与桌面相连接的未开槽部分 5040长度3020100 024681012木条序号14161820
图1-3 各木条的组成情况
h代入(xi,yi(?),zi(?)),可求得桌脚边缘线各点的坐标,
22a如表,我们将用这些数据描述桌脚边缘线。
将????arccos
表2桌脚边缘线的坐标数据
木条序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
X轴坐标 -23.75 -21.25 -18.75 -16.25 -13.75 -11.25 -8.75 -6.25 -3.75 -1.25 1.25 3.75 6.25 8.75 11.25 13.75 16.25 8
Y轴坐标 -22.7791496963108 -17.1323888441318 -14.3771510879539 -12.9865188493691 -12.3476971117286 -12.1231944618212 -12.1106714080814 -12.1854608391201 -12.2712789841449 -12.3242256330333 -12.3242256330333 -12.2712789841449 -12.1854608391201 -12.1106714080814 -12.1231944618212 -12.3476971117286 -12.9865188493691 Z轴坐标 -50 -46.6624633042243 -43.4104091497627 -40.5585095972998 -38.1792931093055 -36.2665194458044 -34.7895951260814 -33.7150281132894 -33.0148422189132 -32.6696548001687 -32.6696548001687 -33.0148422189132 -33.7150281132894 -34.7895951260814 -36.2665194458044 -38.1792931093055 -40.5585095972998 18 19 20 18.75 21.25 23.75 -14.3771510879539 -17.1323888441318 -22.7791496963108 -43.4104091497627 -46.6624633042243 -50
桌脚边缘线的图像如图
桌脚边缘线-30-35-40-45Z轴-50-10-15-20Y轴-25-400-20X轴4020
图1-4 桌脚边缘线的三维形状
桌脚边缘线-30-35Z轴-40-45-50-12-14-16-18Y轴-20-22-24
图1-5 桌脚边缘线的主视图
9
桌脚边缘线-12-14-16Y轴-18-20-22-24-30-20-100X轴102030
图1-6 桌脚边缘线的俯视图
桌脚边缘线-30-35Z轴-40-45-50-30-20-100X轴102030
图1-7 桌脚边缘线的左视图
4.2 问题二的模型建立与求解
针对问题二,折叠桌的设计应做到产品稳固性好、加工方便、用材最少。对于任意给定的折叠桌高度h和圆形桌面直径D(D?2r)的设计要求,讨论长方形平板材料和折叠桌的最优设计加工参数,例如,平板尺寸、钢筋位置、开槽长度等。对于桌高70 cm,桌面直径80 cm的情形,确定最优设计加工参数。
(1)由于折叠桌的宽度已知,所需长方形平板材料的最小尺寸取决于它的长度l(材料厚度不作考虑),木条的宽度由用户指定,记为d。
10
E'αDO'l1*AαCB'hEB图2-1由图2-1可知,木条旋转前E?B?的长度
l?E?D?DA?AB??ED?DA?AB
hh*?2l1? sin?sin??h*??2???l1??sin?? (2.1)?在桌高h固定的情况下,l只与最外侧木条旋转的角度?有关。
(2)由于折叠桌需有稳固的结构,因而我们第二个考虑因素就是其稳定性,
也就是稳度。《物体的稳度与哪些因素有关》[3]记载,物体的稳度与其重心的高度、支撑面的面积有关。重心越低,稳度越高;支撑面的面积越大,稳度越高。图2为折叠桌的示意图。
KE图2
JB
11
1)如图2-2,当支撑面矩形KJBE的面积过大时,重心低,但在力F的作用下,折叠桌容易成恢复平板形态。
F
图2-2
2)如图2-3,当支撑面矩形KJBE的面积过小时,在力F的作用下,折叠桌容易左右晃动,稳定性不好。
F
图2-3
3)由图2所示,KJBE围成的矩形面积逐渐减少,与桌面面积相接近时,折叠桌的稳定性变强。
12
KE图2JB
D为圆面直径,?表示最外侧木条由水平位置转过的角度,???0,??;桌面
面积记为S1,四脚连线围成的矩形面积记为S2。结合图2-1可得:
?D? S1?????2?? (2.2)
2S2?EB?BJh?h? ???l1*??l1*??Dtan??tan???h??2?D???l1*??tan?? (2.3)
(3)开槽的总长度决定了工作量和操作难度,开槽的总长度越长,操作越
不便,坚固性越不好。
与问题一中求开槽长度类似,设最外侧木条的钢筋固定位置距离桌腿与地面接触点的长度为x,最外侧木条的钢筋位置及其由水平位置转过的角度?均为变量,所以得出第i根木条的槽长ei是以?、x为变量的函数,即ei??,x?,在此基础
[D/d]上定义总槽e(?,x)?2??e(?,x)长,其中[Dd]表示Ddii的整数部分,
i?1,2,?,[Dd]。
4.2.1模型建立
按题意要求得到一组最优参数使得桌子具有稳固的结构、耗材量少同时也使
13
得工程量尽可能小,因此我们设立了三个相关变量:总用料长度w1,结构稳定参数w2及桌腿的总槽长w3,如下
?h*w(?)?2?(?l1)?1sin??hD22?*2 w(?)?(S?S)?(2?(?l)?D???())?2211tan?2?[D/d]?w(?,x)?2?ei(?,x)?3?i? (2.4)
可得到一个多目标最优化模型
minf?w1?w2?w3
??0????2? s.t:?maxei(?,x)?x?2a?maxbi?ei(?,x)?0?? (2.5)
f取得最小值时,即可得出最优解(?,x)。
4.2.2模型简化
在折叠桌的设计中,应优先考虑其稳固性,只有折叠桌保证了稳固性,才能体现其功能。加上w1,w2两个量至于?有关,与x无关。因而可以简化模型为
minf1?w1?w2,??s.t.0????2 (2.6)
minf2?w3,s.t.?maxei(?,x)?x?2a?maxbi? ei(?,x)?0? (2.7)
模型?2?是在模型?1?的基础上进行优化,即由模型?1?求出最佳旋转角度?,然后将?带入模型?2?进行优化求出最佳位置x。
4.2.3模型求解
将桌高h?70,圆桌面直径D?80,木条宽度d?3,带入模型?1?,可求的
14
最佳旋转角度??73.6282。长方形最小长度为L?167.619。
4.3 问题三的模型建立与求解
针对问题三,设定折叠桌高度h,桌面边缘线的形状大小S1,桌脚边缘线的大致形状S2和木条的宽度d。其中S1表示的形状和大小等属性要求如表所示。
表3 属性要求 桌面边缘的形状 圆形 正方形 菱形 椭圆 表示形状所需的属性 半径 边长 两对角线长度 长轴和短轴 举例 r?25 l?502 l1?50,l2?60 a?25,b?20 ?? ?? ?? 对桌脚边缘线的要求可以放低,只需近似满足形状即可,而不必苛求属性。
设最外侧木条的钢筋固定位置距离桌腿与地面接触点的长度为x,最外侧木条由水平位置转过的角度为?。
尽管桌面边缘的形状大小不同,但总可以计算出所需木板的宽度D,从而可以得出所需的木条数n,通过桌面边缘线的属性计算桌面边缘线的曲线方程。按照问题一的思路,计算桌面上第i个木条相对于第1个木条多出来的长度bi,可得ci,ei,利用问题二的模型可求得最佳旋转角度?和钢筋的最佳位置x。
要达到桌脚边缘线的要求,需要用穿过两个桌脚的平面去截直纹面,只要截取的曲线可以近似达到S2。
表4 桌面边缘线 属性 桌脚边缘线 矩形板尺寸 桌高 钢筋的位置 对应图像 圆形 无要求 25 120?50 53 26.0969 正方形 无要求 120?50 53 26.0969 502 菱形 无要求 50,60 120?50 53 26.0969 椭圆 无要求 25,20 120?50 53 26.0969
15
100-10-20-30-40-50-600-20-406040200-20-40-60图3-1 圆形桌面
100-10-20-30-40-50-600-20
-406040200-20-40-60图3-2 正方形桌面
16
100-10-20-30-40-50-600-20-406040200-20-40-60图3-3 菱形桌面
五、模型检验
我们经过建立问题二的模型及MATLAB编程运算得到了最优的?。用问题一的桌高h、直径、木条宽度,代入模型中,用附录中程序求得的?与实际角度
?3.36相差,在允许的误差范围之内。因此我们建立的模型是基本准确的。
5.1对模型的稳定性的检验
1) 改变初始角度,求解的结果一致为73.6282,模型较稳定;
2) 给桌高一个微小偏差(此处为0.1),求得结果仍然一致为73.6282; 故模型是稳定的。
5.2模型不足与推广
在问题二的模型中,我们忽略了?、x之间的关联,仅采用了w1,w2两个变量
17
进行最优值的求解。因为无法很好的将变量w3运用在真实解题过程,所以模型的结果存在一定的误差。
该模型中的变量w1,w2,w3均可以被赋予相关系数,从而进一步的得到更加优化而准确的结果。
六、参考文献
[1]赵静,但琪.数学建模与数学实验(第3版),北京:高等教育出版社 2008.01 [2]卢少夫.图形创意设计,上海:人民美术出版社 2007.10.01 [3]赵秀富.物体的稳度与哪些因素有关[物理教师] 1986年03期
[4]王焕定,祁皑.结构力学(第2版),北京:清华大学出版社 2012.07.01 [4]李成标,刘新卫.运筹学,北京:清华大学出版社 2012.08.01 附录
程序1:计算创意折叠桌的一组桌脚边缘线的坐标数据。 d = 2.5; D = 50; L = 120; r = D/2; h = 53 - 3;
n = floor(D/d/2);
l1 = sqrt(r^2-(r-d/2)^2); L1 = L/2 - l1;
theta = pi/2-acos(h/L1); z(1) = -L1*sin(theta); y(1) = -L1*cos(theta)-l1; x(1) = -d*(9+1/2); for j = 2:n
b = sqrt(r^2 - (r-d*(j-1/2))^2)-l1;
c = sqrt(b^2 + (L1/2)^2 - 2*b*(L1/2)*cos(theta)); x(j) = -(10-j+1/2)*d;
18
y(j) = -b-(L1-b)*cos(asin((L1/2)*sin(theta)/c))-l1; if (y(1)+l1)/2 < -b
y(j) = -b - (L1-b)*cos(asin((L1/2)*sin(theta)/c))-l1; else
y(j) = -b + (L1-b)*(cos(asin((L1/2)*sin(theta)/c)))-l1; end
z(j) = -L1/2*sin(theta)*(L1-b)/c; end
for j = n+1:n+n
x(j) = (j-10-1/2)*d; y(j) = y(21-j); z(j) = z(21-j); end
plot3(x,y,z)
title('桌脚边缘线') xlabel('X轴') ylabel('Y轴') zlabel('Z轴') pos = [x',y',z']
程序2:计算每个木条的开槽长度 l1 = sqrt(25^2 - 23.75^2); zhong = (120/2 - l1)/2; h = 50;
theta = acos(h/(120/2 - l1)); stheta = sin(theta); x = []; x(1) = 0; yuan(1) = 0; c = [];
c(1) = zhong; for i = 2:10
yuan2 = sqrt(25^2 - (25-2.5*(i - 1/2))^2); yuan(i) = yuan2 - l1;
c(i) = sqrt(yuan(i)^2 + zhong^2 - 2*yuan(i)*zhong*stheta); x(i) = c(i) + yuan(i) - zhong; end
bar([[(60-yuan-l1-c)';fliplr((60-yuan-l1-c))'],...
19
[x';fliplr(x)'],...
[(60-zhong-l1-yuan)';fliplr(60-zhong-l1-yuan)']],'stacked') xlim([0,21])
title('木条的组成情况')
legend('各木条开槽之外的部分','各木条开槽部分',... '与桌面相连接的未开槽部分','location','best') xlabel('木条序号'); ylabel('长度'); x = [x,fliplr(x)]
程序3:建立优化目标函数fun1 function f = fun1(alpha) h = 70;%桌高 D = 80;%桌直径 d = 3;%木条宽度 r = D/2;
l1 = sqrt(r^2 - (r - (d/2))^2);
f = 2*(h/sin(alpha) + l1) + (2*(h/tan(alpha) + l1)*D - pi*r^2)^2; L = 2*(h/sin(alpha) + l1)
程序4:将模型转化为无约束问题,将角度初值设为2.5(弧度制) [alpha,f] = fminsearch(@fun1,2.5); alpha = alpha/pi*180
程序5:模型检验与稳定性,利用问题一的条件进行检验 function f = fun2(alpha) %问题一条件下的目标函数fun2 h = 50;%桌高 D = 50;%桌直径 d = 2.5;%木条宽度 r = D/2;
l1 = sqrt(r^2 - (r - (d/2))^2);
f = 2*(h/sin(alpha) + l1) + (2*(h/tan(alpha) + l1)*D - pi*r^2)^2;
%检验:计算实际旋转角与模型求出的最佳旋转角的差值 h = 50;
20
l1 = sqrt(25^2 - 23.75^2); theta = acos(h/(120/2 - l1)); theta = 90-theta/pi*180;
[alpha,f] = fminsearch(@fun2,2.5); th = theta - alpha/pi*180
%模型稳定性的检验,通过改变初始角度 [alpha,f] = fminsearch(@fun1,1.5); alpha = alpha/pi*180
[alpha,f] = fminsearch(@fun1,0.5); alpha = alpha/pi*180
%模型稳定性的检验,通过改变桌高 %建立目标函数fun3
function f = fun3(alpha) h = 69.9;%桌高 D = 80;%桌直径 d = 3;%木条宽度 r = D/2;
l1 = sqrt(r^2 - (r - (d/2))^2);
f = 2*(h/sin(alpha) + l1) + (2*(h/tan(alpha) + l1)*D - pi*r^2)^2;
[alpha,f] = fminsearch(@fun3,2.5); alpha = alpha/pi*180
程序6:圆桌面创意折叠桌,在当前目录下会产生名为“圆桌创意折叠桌.gif”的动画。
warning off all d = 2.5; D = 50; L = 120; r = D/2; h = 53 - 3;
21
n = floor(D/d/2);
l1 = sqrt(r^2-(r-d/2)^2); L1 = L/2 - l1;
theta = acos(h/L1);
fileName = '圆桌创意折叠桌'; hold on
for i = 0:0.01:pi/2-theta z1(1) = -L1*sin(i); y1(1) = -L1*cos(i)-l1; x1(1) = -d/2;
plot3([x1(1),x1(1),x1(1),x1(1)],[y1(1),-l1,l1,-y1(1)],... [z1(1),0,0,z1(1)]) for j = 2:n hold on
b(j) = sqrt(r^2 - (r-d*(j-1/2))^2)-l1;
c(j) = sqrt(b(j)^2 + (L1/2)^2 - 2*b(j)*(L1/2)*cos(i)); x1(j) = -(j-1/2)*d;
y1(j) = -b(j)-(L1-b(j))*cos(asin((L1/2)*sin(i)/c(j)))-l1; if (y1(1)+l1)/2 < -b(j) y1(j) = -b(j) - (L1-b(j))*cos(asin((L1/2)*sin(i)/c(j)))-l1; else
y1(j) = -b(j) + (L1-b(j))*(cos(asin((L1/2)*sin(i)/c(j))))-l1; end
z1(j) = -L1/2*sin(i)*(L1-b(j))/c(j); plot3([x1(j),x1(j),x1(j),x1(j)],... [y1(j),-b(j)-l1,b(j)+l1,-y1(j)],... [z1(j),0,0,z1(j)]) end
for j = n+1:n+n
x1(j) = -(j-1/2)*d; y1(j) = y1(21-j); z1(j) = z1(21-j);
plot3([x1(j),x1(j),x1(j),x1(j)],...
[y1(j),-b(21-j)-l1,b(21-j)+l1,-y1(j)],... [z1(j),0,0,z1(j)]) hold on end
axis([-50,0,-70,70,-60,10]); view([-97,6])
plot3([x1(1),x1(end)],[(y1(1)+l1)/2-l1,(y1(1)+l1)/2-l1],... [z1(1)/2,z1(1)/2],'k')
plot3([x1(1),x1(end)],[-(y1(1)+l1)/2+l1,-(y1(1)+l1)/2+l1],... [z1(1)/2,z1(1)/2],'k')
22
wg = getframe;
imindex = frame2im(wg);
[imindex,cm] = rgb2ind(imindex,256); hold off if i ~= 0
imwrite(imindex,cm,fileName,'gif','WriteMode','append',... 'DelayTime',0.01); pause(0.05) else
imwrite(imindex,cm,fileName,'gif','Loopcount',inf,... 'DelayTime',0.1); pause(1) end end
for k = 1:3:16
view([-97+k,6]) pause(0.5) end
程序7:正方形桌面创意折叠桌,在当前目录下会产生名为“正方形创意折叠桌.gif”的动画。 warning off all d = 2.5; D = 50; L = 120; h = 53 - 3;
n = floor(D/d/2); l1 = d/2;
L1 = L/2 - l1;
theta = acos(h/L1);
fileName = '正方形创意折叠桌'; %
hold on
for i = 0:0.01:pi/2-theta z1(1) = -L1*sin(i); y1(1) = -L1*cos(i)-l1; x1(1) = -d/2;
plot3([x1(1),x1(1),x1(1),x1(1)],[y1(1),-l1,l1,-y1(1)],... [z1(1),0,0,z1(1)]) for j = 2:n hold on
x1(j) = -(j-1/2)*d; b(j) = -x1(j)-l1;
23
c(j) = sqrt(b(j)^2 + (L1/2)^2 - 2*b(j)*(L1/2)*cos(i)); y1(j) = -b(j)-(L1-b(j))*cos(asin((L1/2)*sin(i)/c(j)))-l1; if (y1(1)+l1)/2 < -b(j) y1(j) = -b(j) - (L1-b(j))*cos(asin((L1/2)*sin(i)/c(j)))-l1; else
y1(j) = -b(j) + (L1-b(j))*(cos(asin((L1/2)*sin(i)/c(j))))-l1; end
z1(j) = -L1/2*sin(i)*(L1-b(j))/c(j); plot3([x1(j),x1(j),x1(j),x1(j)],... [y1(j),-b(j)-l1,b(j)+l1,-y1(j)],... [z1(j),0,0,z1(j)]) end
for j = n+1:n+n
x1(j) = -(j-1/2)*d; y1(j) = y1(21-j); z1(j) = z1(21-j);
plot3([x1(j),x1(j),x1(j),x1(j)],...
[y1(j),-b(21-j)-l1,b(21-j)+l1,-y1(j)],... [z1(j),0,0,z1(j)]) hold on end
axis([-50,0,-70,70,-60,10]); view([-97,6])
plot3([x1(1),x1(end)],[(y1(1)+l1)/2-l1,(y1(1)+l1)/2-l1],... [z1(1)/2,z1(1)/2],'k')
plot3([x1(1),x1(end)],[-(y1(1)+l1)/2+l1,-(y1(1)+l1)/2+l1],... [z1(1)/2,z1(1)/2],'k') wg = getframe;
imindex = frame2im(wg);
[imindex,cm] = rgb2ind(imindex,256); hold off if i ~= 0
imwrite(imindex,cm,fileName,'gif','WriteMode','append',... 'DelayTime',0.01); pause(0.5) else
imwrite(imindex,cm,fileName,'gif','Loopcount',inf,... 'DelayTime',0.1); pause(1) end end
for k = 1:3:16
view([-97+k,6])
24
pause(0.5) end
程序8:菱形桌面的创意折叠桌, warning off all d = 2.5; D = 50; L = 120; h = 53 - 3;
n = floor(D/d/2); l1 = d/2;
L1 = L/2 - l1;
theta = acos(h/L1);
fileName = '菱形创意折叠桌'; %
hold on
for i = 0:0.01:pi/2-theta z1(1) = -L1*sin(i); y1(1) = -L1*cos(i)-l1; x1(1) = -d/2;
plot3([x1(1),x1(1),x1(1),x1(1)],[y1(1),-l1,l1,-y1(1)],... [z1(1),0,0,z1(1)]) for j = 2:n hold on
x1(j) = -(j-1/2)*d; b(j) = -1.2*x1(j)-l1;
c(j) = sqrt(b(j)^2 + (L1/2)^2 - 2*b(j)*(L1/2)*cos(i)); y1(j) = -b(j)-(L1-b(j))*cos(asin((L1/2)*sin(i)/c(j)))-l1; if (y1(1)+l1)/2 < -b(j) y1(j) = -b(j) - (L1-b(j))*cos(asin((L1/2)*sin(i)/c(j)))-l1; else
y1(j) = -b(j) + (L1-b(j))*(cos(asin((L1/2)*sin(i)/c(j))))-l1; end
z1(j) = -L1/2*sin(i)*(L1-b(j))/c(j); plot3([x1(j),x1(j),x1(j),x1(j)],... [y1(j),-b(j)-l1,b(j)+l1,-y1(j)],... [z1(j),0,0,z1(j)]) end
for j = n+1:n+n
x1(j) = -(j-1/2)*d; y1(j) = y1(21-j); z1(j) = z1(21-j);
25
plot3([x1(j),x1(j),x1(j),x1(j)],...
[y1(j),-b(21-j)-l1,b(21-j)+l1,-y1(j)],... [z1(j),0,0,z1(j)]) hold on end
axis([-50,0,-70,70,-60,10]); view([-97,6])
plot3([x1(1),x1(end)],[(y1(1)+l1)/2-l1,(y1(1)+l1)/2-l1],... [z1(1)/2,z1(1)/2],'k')
plot3([x1(1),x1(end)],[-(y1(1)+l1)/2+l1,-(y1(1)+l1)/2+l1],... [z1(1)/2,z1(1)/2],'k') wg = getframe;
imindex = frame2im(wg);
[imindex,cm] = rgb2ind(imindex,256); hold off if i ~= 0
imwrite(imindex,cm,fileName,'gif','WriteMode','append',... 'DelayTime',0.01); pause(0.5) else
imwrite(imindex,cm,fileName,'gif','Loopcount',inf,... 'DelayTime',0.1); pause(1) end end
for k = 1:3:16
view([-97+k,6]) pause(0.5) end
26