电脑
Mathematica10.0以上版本
把正方形分割成几块,能拼接成上图所示的花瓶? Mathematica代码如下图,运行结果如下面第二幅图。
把正方形改拼成正五边形。 先做一些准备工作,搞几个自定义函数: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}]; 提前运行这些自定义代码,然后运行下面的主题代码(见图片)。
把正方形改拼成正六边形的一个方法。 自定义代码: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}]; 主题代码如图。
把正方形变成正六边形的另一个方法。 自定义函数是: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}]; 然后主题代码是如图。
把正方形用一种分割方法,能改拼成不同的形状——十字形、直角三角形、平行四边形、矩形、不规则四边形。 自定义函数是: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]]}]}; 互动代码如图。
正方形改拼成正十二边形,只需要分割成六块。 自定义代码是: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}]; 主题代码如图。
所有的演示项目均来自Mathematica官方网站。
代码较长,所以不能全部写出来,只好截图。
动态图并非代码导出来的,而是用liceCap截取的。