多语言展示
当前在线:1190今日阅读:6今日分享:31

正方形的改拼——用Mathematica实现的互动效果

正方形的分割拼接问题,是趣味数学里面一个非常有趣的问题。它的解法通俗易懂,但是却又是难以想到的!如果让你凭空思考下面的问题的解法,你感觉要用多长时间呢?——怎么把一个正方形改拼成一个曲边的花瓶?        前面写过一篇《正方形的分割问题举例》,有兴趣的话,可以去看看。        下面,就分享几个用Mathematica来实现正方形改拼的动态模拟的代码。4正方形的分割问题举例
工具/原料
1

电脑

2

Mathematica10.0以上版本

方法/步骤
1

把正方形分割成几块,能拼接成上图所示的花瓶?        Mathematica代码如下图,运行结果如下面第二幅图。

2

把正方形改拼成正五边形。        先做一些准备工作,搞几个自定义函数:ngon[n_] :=  Table[{Re[ I Exp[I 2 Pi i/n]], Im[I Exp[I 2 Pi i/(n)]]}, {i, 0,     n}] // Nintersection2lines[r1_, e1_, r2_, e2_] :=  First[(r1 + t e1) /. Solve[r1 + t e1 == r2 + u e2, {t, u}]]Brodie[hint_, k1_, k2_, k3_, k4_] := Module[{AA = ngon[5][[1]], BB = ngon[5][[2]], CC = ngon[5][[3]],    DD = ngon[5][[4]], EE = ngon[5][[5]], aa, a1 = 2 Sin[Pi/5], hh},   FF = BB + RotationMatrix[2 Pi - 6 Pi/5].(AA - BB); GG = (FF + CC)/2;   II = GG + (EE - DD)/2; JJ = 2 GG - II;   aa = Sqrt[Norm[DD - JJ] Norm[EE - DD] Sin[Pi - 3 Pi/5]];   hh = Norm[EE - DD] Sin[Pi - 3 Pi/5]; \[Alpha] = ArcSin[hh/aa];   KK = EE + aa {Cos[\[Alpha]], -Sin[\[Alpha]]};  LL = KK - aa {Sin[\[Alpha]], Cos[\[Alpha]]};   MM = EE - aa {Sin[\[Alpha]], Cos[\[Alpha]]};  NN = intersection2lines[MM, LL - MM, BB, CC - BB];  PP = intersection2lines[MM, LL - MM, CC, CC - DD];  triangle1 = Polygon[{II, NN, BB}];   triangle1A = Rotate[Translate[triangle1, AA - BB], Pi/5, AA];  triangle2 = Polygon[{JJ, CC, GG}];   triangle2A =    Rotate[Translate[Polygon[{FF, GG, II}], AA - BB], Pi/5, AA];  quad1 = Polygon[{GG, CC, NN, II}];   quad1A = Rotate[Translate[quad1, AA - BB], Pi/5, AA];  triangle3 = Polygon[{NN, CC, PP}];  quad2 = Polygon[{BB, NN, MM, EE}];  quad3 = Polygon[{MM, PP, DD, EE}];        提前运行这些自定义代码,然后运行下面的主题代码(见图片)。

3

把正方形改拼成正六边形的一个方法。        自定义代码:ngon[n_] := Table[{Re[  Exp[I 2 Pi i/n + I Pi/(n)]], Im[ Exp[I 2 Pi i/(n) + I Pi/(n)]]}, {i, 0, n}] // N;intersection2lines[r1_, e1_, r2_, e2_] := First[(r1 + t e1) /. NSolve[r1 + t e1 == r2 + u e2, {t, u}]];ClosedLine[a_] := Line[Append[a, First[a]]];ngontext[n_] := Table[Text[ToString[i + 1], {Re[  Exp[I 2 Pi i/n + I Pi/(n)]], Im[ Exp[I 2 Pi i/(n) + I Pi/(n)]]}, {1, 1}], {i, 0, n - 1}] // N;ngon[r_, n_] := Table[r {Re[  Exp[I 2 Pi i/n]], Im[ Exp[I 2 Pi i/(n)]]}, {i, 0, n}] // N;ngontext[r_, n_] := Table[Text[ToString[i + 1], r {Re[  Exp[I 2 Pi i/n]], Im[ Exp[I 2 Pi i/(n)]]}, {1, 1}], {i,  0, n - 1}] // N;ngon2[n_] := Table[{Re[  Exp[I 2 Pi i/n]], Im[ Exp[I 2 Pi i/(n)]]}, {i, 0, n - 1}] // N;OctagonToSquare[hint_, k1_, k2_, opts___] := Module[{a = Sqrt[4 Sin[Pi/4]], square, octagon = ngon[8], pent1, pent2, pent3, pent4, r2, square1, trvectors, square2, triangle1, hepta1, r1, square3, pentagons}, r1 = Sin[Pi/8] Sqrt[2];   square = ngon[r1, 4]; r2 = a /Sqrt[2]; square1 = ngon[r2, 4];\[Gamma] = ArcSin[Tan[Pi/8]] // N;  square2 = ngon[r1, 4].RotationMatrix[-\[Gamma]];  square3 = {square2[[4]], square2[[4]] + a Normalize[square2[[4]] - square2[[3]]], square2[[4]] + a Normalize[square2[[4]] - square2[[3]]] + a Normalize[square2[[1]] - square2[[4]]],  square2[[4]] + a Normalize[square2[[1]] - square2[[4]]]};  pentagons = Table[{square2[[1]], (octagon[[1]] + octagon[[2]])/2, octagon[[2]],octagon[[3]], (octagon[[3]] + octagon[[4]])/2}.RotationMatrix[ Pi/2 (i - 1)], {i, 1, 4}];        主题代码如图。

4

把正方形变成正六边形的另一个方法。        自定义函数是:ngon[n_] :=  Table[{Re[ Exp[I 2 Pi i/n]], Im[ Exp[I 2 Pi i/(n)]]}, {i, 0, n}] // N(*2D intersection of stright lines*)intersection2lines[r1_, e1_, r2_, e2_] :=  First[(r1 + t e1) /. Solve[r1 + t e1 == r2 + u e2, {t, u}]]Busschop[k_, hint_] :=  Module[{AA = ngon[6][[4]], BB = ngon[6][[1]], CC = ngon[6][[2]],    aa = Sqrt[3 Sqrt[3]/2] // N,    DD = ngon[6][[3]], \[Alpha] = ArcSin[Sqrt[3 Sqrt[3]/2]/3 // N], EE,    FF = {2, 0}, GG, AE}, AE = Sqrt[9 - 3 Sqrt[3]/2];   EE = AE {Cos[\[Alpha]], Sin[\[Alpha]]} - {1, 0};  GG = intersection2lines[AA, EE - AA, DD, {1, 0}];  II = intersection2lines[EE, EE - FF, DD, {1, 0}];  LL = EE - aa {Cos[\[Alpha]], Sin[\[Alpha]]};  KK = FF - aa {Cos[\[Alpha]], Sin[\[Alpha]]};  MM = KK + (DD - AA);  NN = intersection2lines[AA, {1, 0}, LL, KK - LL];  triangle1 = Polygon[{GG, II, EE}];  triangle2 = Polygon[{NN, KK, MM}];  triangle3 = Polygon[{MM, KK, FF}];  quad1 = Polygon[{BB, FF, II, CC}];  pent1 = Polygon[{NN, BB, CC, GG, LL}];        然后主题代码是如图。

5

把正方形用一种分割方法,能改拼成不同的形状——十字形、直角三角形、平行四边形、矩形、不规则四边形。        自定义函数是:p1 = {0, 0}; p2 = {0.5, 0}; p3 = {1, 0}; p4 = {1, 1}; p5 = {0.5, 1}; p6 = {0, 1};alpha = ArcTan[0.5];p7 = p6 + ({0.5, 0}.{Cos[alpha], Sin[-alpha]}) {Cos[alpha], Sin[-alpha]};p8 = p6 + ({1, 0}.{Cos[alpha], Sin[-alpha]}) {Cos[alpha], Sin[-alpha]};p9 = ({0, 0.5}.{Cos[Pi/2 - alpha], Sin[Pi/2 - alpha]}) {Cos[Pi/2 - alpha], Sin[Pi/2 - alpha]};p10 = p9 + (p8 - p7);pps = {p1, p2, p3, p4, p5, p6, p7, p8, p9, p10};hex1 = {Red, Polygon[{pps[[1]], pps[[2]], pps[[10]], pps[[9]], pps[[7]], pps[[6]]}]};tr1 = {Blue, Polygon[{pps[[2]], pps[[3]], pps[[4]]}]};tr2 = {Green, Polygon[{pps[[6]], pps[[7]], pps[[5]]}]};square1 = {Cyan, Polygon[{pps[[8]], pps[[7]], pps[[9]], pps[[10]]}]};trap1 = {Yellow, Polygon[{pps[[8]], pps[[4]], pps[[5]], pps[[7]]}]};        互动代码如图。

6

正方形改拼成正十二边形,只需要分割成六块。        自定义代码是:ngon[n_] := Table[{Re[  Exp[I 2 Pi i/n + I Pi/(n)]], Im[ Exp[I 2 Pi i/(n) + I Pi/(n)]]}, {i, 0, n}] // N;ngontext[n_] := Table[Text[ToString[i + 1], {Re[  Exp[I 2 Pi i/n + I Pi/(n)]], Im[ Exp[I 2 Pi i/(n) + I Pi/(n)]]}, {1, 1}], {i, 0, n - 1}] // N;ngon[r_, n_] := Table[r {Re[  Exp[I 2 Pi i/n]], Im[ Exp[I 2 Pi i/(n)]]}, {i, 0, n}] // N;ngontext[r_, n_] := Table[Text[ToString[i + 1], r {Re[  Exp[I 2 Pi i/n]], Im[ Exp[I 2 Pi i/(n)]]}, {1, 1}], {i, 0, n - 1}] // N;ngon2[n_] := Table[{Re[  Exp[I 2 Pi i/n]], Im[ Exp[I 2 Pi i/(n)]]}, {i, 0, n - 1}] // N;pentagons = Table[Polygon[{dodecagon[[1 + 3 i]], dodecagon[[2 + 3 i]], dodecagon[[3 + 3 i]], square1[[Mod[i + 2, 4, 1]]], square1[[i + 1]]}], {i, 0, 3}]; trvectors = Table[square[[Mod[3 + i, 4, 1]]] - dodecagon[[Mod[4 + 3 i, 12]]], {i,0, 3}];        主题代码如图。

注意事项
1

所有的演示项目均来自Mathematica官方网站。

2

代码较长,所以不能全部写出来,只好截图。

3

动态图并非代码导出来的,而是用liceCap截取的。

推荐信息