找回密码
 注册
Simdroid-非首页
查看: 1648|回复: 27

[演示项目] 魔方( Rubik's Cube) 编程实现,算法专题研讨!

[复制链接]
发表于 2009-7-20 21:02:50 | 显示全部楼层 |阅读模式 来自 黑龙江大庆
本帖最后由 FreddyMusic 于 2009-10-25 13:00 编辑

如何让代码生成的魔方运动起来呢???

  1. Clear[Lcounter, Rcounter, Fcounter, Bcounter, Ucounter, Dcounter,
  2.   Matrix, FinalMatrix];
  3. ClearSystemCache[];
  4. Lcounter :=
  5.   Do[{FinalMatrix[[1]], FinalMatrix[[2, 1]], FinalMatrix[[3, 1]],
  6.      FinalMatrix[[5, 1]], FinalMatrix[[6, 1]]} =
  7.     Map[#.RotationMatrix[Pi/90, {1, 0, 0}] &, {FinalMatrix[[1]],
  8.       FinalMatrix[[2, 1]], FinalMatrix[[3, 1]], FinalMatrix[[5, 1]],
  9.       FinalMatrix[[6, 1]]}, {-2}], {i, 45}];
  10. (*The adjacent faces of left (1) are 2,3,5 and 6,while all adjacent \
  11. facets which need to rotate are on the higher depth of the table*)
  12. Rcounter :=
  13.   Do[{FinalMatrix[[4]], FinalMatrix[[2, 3]], FinalMatrix[[3, 3]],
  14.      FinalMatrix[[5, 3]], FinalMatrix[[6, 3]]} =
  15.     Map[#.RotationMatrix[Pi/90, {-1, 0, 0}] &, {FinalMatrix[[4]],
  16.       FinalMatrix[[2, 3]], FinalMatrix[[3, 3]], FinalMatrix[[5, 3]],
  17.       FinalMatrix[[6, 3]]}, {-2}], {i, 45}];
  18. (*Same to L*)
  19. Fcounter :=
  20.   Do[{FinalMatrix[[2]], FinalMatrix[[1, 1]], FinalMatrix[[3, All, 1]],
  21.       FinalMatrix[[4, 1]], FinalMatrix[[6, All, 1]]} =
  22.     Map[#.RotationMatrix[Pi/90, {0, 1, 0}] &, {FinalMatrix[[2]],
  23.       FinalMatrix[[1, 1]], FinalMatrix[[3, All, 1]],
  24.       FinalMatrix[[4, 1]], FinalMatrix[[6, All, 1]]}, {-2}], {i, 45}];
  25. (*Need to change 3 and 6 because affected facets are on same column \
  26. but not row*)
  27. Bcounter :=
  28.   Do[{FinalMatrix[[5]], FinalMatrix[[1, 3]], FinalMatrix[[3, All, 3]],
  29.       FinalMatrix[[4, 3]], FinalMatrix[[6, All, 3]]} =
  30.     Map[#.RotationMatrix[Pi/90, {0, -1, 0}] &, {FinalMatrix[[5]],
  31.       FinalMatrix[[1, 3]], FinalMatrix[[3, All, 3]],
  32.       FinalMatrix[[4, 3]], FinalMatrix[[6, All, 3]]}, {-2}], {i, 45}];
  33. Ucounter :=
  34. Do[{FinalMatrix[[6]], FinalMatrix[[1, All, 3]],
  35.     FinalMatrix[[2, All, 3]], FinalMatrix[[4, All, 3]],
  36.     FinalMatrix[[5, All, 3]]} =
  37.    Map[#.RotationMatrix[Pi/90, {0, 0, 1}] &, {FinalMatrix[[6]],
  38.      FinalMatrix[[1, All, 3]], FinalMatrix[[2, All, 3]],
  39.      FinalMatrix[[4, All, 3]], FinalMatrix[[5, All, 3]]}, {-2}], {i,
  40.    45}]
  41. Dcounter :=
  42.   Do[{FinalMatrix[[3]], FinalMatrix[[1, All, 1]],
  43.      FinalMatrix[[2, All, 1]], FinalMatrix[[4, All, 1]],
  44.      FinalMatrix[[5, All, 1]]} =
  45.     Map[#.RotationMatrix[Pi/90, {0, 0, 1}] &, {FinalMatrix[[3]],
  46.       FinalMatrix[[1, All, 1]], FinalMatrix[[2, All, 1]],
  47.       FinalMatrix[[4, All, 1]], FinalMatrix[[5, All, 1]]}, {-2}], {i,
  48.     45}];
  49. Matrix = Map[
  50.    Function[x,
  51.     Map[x + # &, {{-1.5, -1.5}, {-0.5, -1.5}, {-0.5, -0.5}, {-1.5, \
  52. -0.5}}]], {{{0, 0}, {0, 1}, {0, 2}}, {{1, 0}, {1, 1}, {1, 2}}, {{2,
  53.       0}, {2, 1}, {2, 2}}}, {-2}];
  54. FinalMatrix =
  55.   Flatten[Table[
  56.     Map[Insert[#, i, j] &,
  57.      Matrix, {-2}], {i, {-1.5, 1.5}}, {j, {1, 2, 3}}], 1];
  58. (*FinalMatrix第一层为六个面,顺序为左右后前下上,第二层为每个面的一行三个块,第三层为每行的三个小正方形,第四层为么个小正方形的\
  59. 四个定点坐标*)
  60. Dynamic[Graphics3D[{Riffle[{Yellow, Green, Red, White, Blue, Orange},
  61.     Map[Polygon, FinalMatrix, {-3}]]}, Boxed -> False,
  62.   PlotRange -> 2.5]]
复制代码
发表于 2009-7-20 22:49:17 | 显示全部楼层 来自 江苏无锡
Simdroid开发平台
这不是 tau 的代码吗 ?

不要念他的代码,你先念他的签名。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-7-21 08:57:35 | 显示全部楼层 来自 黑龙江大庆
什么意思呢???我以为那魔方能动起来呢!!!只是少了些什么 难懂的东西啊
回复 不支持

使用道具 举报

发表于 2009-8-15 11:34:19 | 显示全部楼层 来自 陕西宝鸡
本帖最后由 ggggwhw 于 2009-8-15 11:51 编辑

尽管我的代码也动不起来,但是我有理由认为我的代码要好一些,至少看起来短啊,但是有一点不是很满意就是每个面转到不同的位置由于光线的问题,会对颜色产生影响.我曾经用Lighting语句使得整个图像转动角度时,每个面的颜色不变,但是显示有语法错误.希望谁能改进一下.

  1. (*魔方上有六个面,各个面的颜色个不相同,每一个面上有九个小方框,每一个小方框有四个顶点*)
  2. (*zbmian是六个不同坐标,六个面中每一个面会用到其中一个坐标*)
  3. zbmian = {{0, 0, 0}, {1, 0, 0}, {0, 0, -1}, {0, 0, 0}, {0, 0, 0}, {0,
  4.     1, 0}};
  5. (*yanse是八种不同颜色,六个面中每一个面会用到其中一种颜色,未用黑和白*)
  6. yanse = Tuples[{0, 1}, 3];
  7. (*zbding是八个不同坐标,每个小方框的四个顶点会用其中的四个坐标*)
  8. zbding = Tuples[{-1/2, 1/2}, 3];
  9. (*xuanze是三种不同的坐标选择,六个面中每两个面会用到其中一种坐标选择*)
  10. xuanze = {{1, 2, 4, 3}, {2, 4, 8, 6}, {1, 2, 6, 5}};
  11. (*zbkuang用来记录五十四个不同的位置坐标,每个小方框会用到其中一个位置坐标*)
  12. zbkuang = {};
  13. (*此处jj代表三个不同方向*)
  14. For[jj = 0, jj < 3, jj++,(*此处ii代表每个方向两个面*)
  15. For[ii = 1, ii < 3, ii++,(*此处Tuples用来产生二十七个位置坐标,
  16.   每次循环zbkuang记录其中的九个位置坐标,二乘以三等于六次循环共记录五十四个位置坐标*)
  17.   zbkuang =
  18.     Append[zbkuang,
  19.      RotateLeft[Flatten[Partition[Tuples[{-1, 1, 0}, 3], 9][[ii]]],
  20.       jj]];]]
  21. zbkuang = Partition[Partition[Flatten[zbkuang], 3], 9];
  22. (*k用来记录五十四个小方框的编号*)
  23. k = 1;
  24. (*此处jj代表六个不同的面*)
  25. For[jj = 1, jj < 7, jj++,(*此处ii代表每个面上九个不同的小方框*)
  26. For[ii = 1, ii < 10, ii++,(*tu[k++]用来记录五十四个小方框*)
  27.   tu[k++] = {{RGBColor[yanse[[jj + 1]]],
  28.       GraphicsComplex[
  29.        zbding + ConstantArray[zbkuang[[jj, ii]] + zbmian[[jj]], 8],
  30.        Polygon[xuanze[[Ceiling[jj/2]]]]]}};]]
  31. (*Graphics3D用来画魔方图*)
  32. Graphics3D[Table[tu[ii], {ii, 1, 54}], Lighting -> "Neutral",
  33. Boxed -> False]
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-8-16 10:29:48 | 显示全部楼层 来自 山西太原
这是我的代码么?我怎么没印象?以下是去上海时Freddy见到的那个版本:
  1. Matrix = Map[
  2.    Function[x,
  3.     Map[x + # &, {{-1.5, -1.5}, {-0.5, -1.5}, {-0.5, -0.5}, {-1.5, \
  4. -0.5}}]], {{{0, 0}, {0, 1}, {0, 2}}, {{1, 0}, {1, 1}, {1, 2}}, {{2,
  5.       0}, {2, 1}, {2, 2}}}, {-2}];
  6. (*这是一个面9个小方格的坐标,由16个不同的顶点组成。这16个顶点的坐标是由-1.5,-0.5,0.5以及1 \
  7. .5四个数字Outer出来的*)
  8. FinalMatrix =
  9.   Flatten[Table[
  10.     Map[Insert[#, i, j] &,
  11.      Matrix, {-2}], {i, {-1.5, 1.5}}, {j, {1, 2, 3}}], 1];
  12. (*将其变换为六个三维的面*)
  13. FinalGraphics =
  14.   Flatten@Riffle[{Yellow, Green, Orange, White, Blue, Red},
  15.     Map[Polygon, FinalMatrix, {-3}]];
  16. (*插入图形Primitive以及颜色*)

  17. Twist[a_, b_] :=(*RotationMatrix version*)
  18. Do[FinalGraphics[[
  19.     Flatten[Position[FinalGraphics,
  20.       Polygon[{___,
  21.         Insert[{_, _}, x_ /; If[a > 0, x > a, x < a], b], ___}]]]]] =
  22.    Map[#.RotationMatrix[Pi/180, Insert[{0, 0}, a, b]] &,
  23.     FinalGraphics[[
  24.      Flatten[Position[FinalGraphics,
  25.        Polygon[{___,
  26.          Insert[{_, _}, x_ /; If[a > 0, x > a, x < a],
  27.           b], ___}]]]]], {-3}], {i, 90}]

  28. Twist2[a_, b_] :=(*RotateTransform version (much faster) *)
  29. Do[FinalGraphics[[
  30.     Flatten[Position[FinalGraphics,
  31.       Polygon[{___,
  32.         Insert[{_, _}, x_ /; If[a > 0, x > a, x < a], b], ___}]]]]] =
  33.    Map[RotationTransform[Pi/270, Insert[{0, 0}, a, b]],
  34.     FinalGraphics[[
  35.      Flatten[Position[FinalGraphics,
  36.        Polygon[{___,
  37.          Insert[{_, _}, x_ /; If[a > 0, x > a, x < a],
  38.           b], ___}]]]]], {-3}], {i, 135}]
  39. (*旋转应用了模式匹配。一次旋转需要改变21个小方块的坐标,这21个小方块的特点是它们一定会有至少两个在相同的平面上。用Position找到\
  40. 它们在FinalGraphics中的原始位置,然后乘以用RotationMatrix生成的旋转矩阵*)

  41. QuickTwist[a_, b_] :=
  42. Do[FinalGraphics[[
  43.     Flatten[Position[FinalGraphics,
  44.       Polygon[{___,
  45.         Insert[{_, _}, x_ /; If[a > 0, x > a, x < a], b], ___}]]]]] =
  46.    Map[RotationTransform[Pi/2, Insert[{0, 0}, a, b]],
  47.     FinalGraphics[[
  48.      Flatten[Position[FinalGraphics,
  49.        Polygon[{___,
  50.          Insert[{_, _}, x_ /; If[a > 0, x > a, x < a],
  51.           b], ___}]]]]], {-2}], {1}]
  52. (*考虑魔方由原始位置打乱顺序不需要详细显示旋转过程,所以在此采取 \[OpenCurlyDoubleQuote]一步到位\
  53. \[CloseCurlyDoubleQuote]的旋转*)

  54. Scramble[n_] :=
  55. Do[Twist2[RandomChoice[{-1, 1}], RandomChoice[{1, 2, 3}]], {n}]
  56. (*随机地旋转,制定打乱顺序的操作次数*)

  57. DynamicModule[{},
  58. EventHandler[
  59.   Dynamic[Graphics3D[{Opacity[0.9], FinalGraphics},
  60.     PlotRange -> 2.1]], {{"KeyDown", "s"} :> Scramble[10]}]]
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-8-16 21:43:09 | 显示全部楼层 来自 江苏无锡
我认为每行有注释的魔方代码,搞得不错。
你们几个相互再多探讨、切磋一下,争取写篇稿子出来。
回复 不支持

使用道具 举报

发表于 2009-10-20 20:57:17 | 显示全部楼层 来自 上海宝山区
tau,

看到一则信息说,几行所有的魔方随机初始都可以在 17 步内由计算机解题成功。

你的程序需要几步解题呢?
回复 不支持

使用道具 举报

发表于 2009-11-1 17:09:04 | 显示全部楼层 来自 北京
很厉害啊,但是没看明白。
回复 不支持

使用道具 举报

发表于 2009-11-10 01:14:50 | 显示全部楼层 来自 山西太原
7# FreddyMusic

你既然看到了论文,那就不妨看一下他为了证明17步这个下限花了多长时间好了
回复 不支持

使用道具 举报

发表于 2009-11-10 13:12:51 | 显示全部楼层 来自 江苏无锡
Rubik's Cube 你们要搞个算法出来,启发式的也好,缓慢式的也好,但是总要有一个。
不能基于别人的代码作为自己的核心,这样的项目没有用。

现在你们仨个人,搞得都是界面,没有核心。
不一定说你们现在要动手(大家都很忙),但是一定要把它彻底解决?脑子不能停。明白?
回复 不支持

使用道具 举报

发表于 2009-11-13 20:04:48 | 显示全部楼层 来自 陕西西安
老大们厉害,都开始编程序算法了。我最近自己在研究魔方呢~相当的不容易呀,才到第二层,越来越难了!
回复 不支持

使用道具 举报

发表于 2009-12-17 08:55:30 | 显示全部楼层 来自 辽宁沈阳
我是初学,还有点看不懂呀
回复 不支持

使用道具 举报

发表于 2010-1-10 08:29:08 | 显示全部楼层 来自 河北石家庄
厉害     啊
回复 不支持

使用道具 举报

发表于 2010-1-11 20:12:24 | 显示全部楼层 来自 广东佛山
没想到魔方还能够编上程序  太有才了
回复 不支持

使用道具 举报

发表于 2010-1-26 20:57:00 | 显示全部楼层 来自 北京
太厉害了 学习学习
回复 不支持

使用道具 举报

发表于 2010-2-27 16:44:00 | 显示全部楼层 来自 湖南长沙
一个字,厉害,这软件很强大!
回复 不支持

使用道具 举报

发表于 2010-4-1 22:17:26 | 显示全部楼层 来自 重庆沙坪坝区
呵呵~~有意思!!
回复 不支持

使用道具 举报

发表于 2010-4-13 16:26:16 来自 湖北宜昌
17# 成风醉雅
不支持

发表于 2010-4-17 17:28:51 | 显示全部楼层 来自 上海
佩服  什么时候我也有这水平呀??
回复 不支持

使用道具 举报

发表于 2010-4-19 09:08:51 | 显示全部楼层 来自 华南理工大学
我也想过模拟一个可以翻转起来的魔方,不过现在水平还不够……
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-27 00:20 , Processed in 0.057976 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表