- 积分
- 12
- 注册时间
- 2008-7-11
- 仿真币
-
- 最后登录
- 1970-1-1
|
本帖最后由 marveloustau 于 2010-6-20 00:11 编辑
Ideas Exchanging|讲出你的想法
Intruduction =================================================
经过认真考虑,我打算策划这么一起活动。如果你觉得利用Mathematica现有的功能组合能够做一些好玩的东西,那么不要犹豫马上跟贴!也许你打算向大家展示一下你的成果,也许你有足够的勇气去挑战一个难题却需要大家帮助,或者仅仅是有一个非常酷的想法而并没有打算自己实现,没有关系,都在这里讲出来!
这个帖子由我来维护,所以不用特别在乎格式,只要在后面跟贴就行了。不过当然想法说的越明白越好,如果你能把想法描述的具体一些,那么对于你自己开发的可行性也就越强。对于某些用文字很难说明的问题,或者是已经有一个很现成的材料,那么就附上图片或网页链接就好。如果是对这个项目本身进行的讨论请另开新贴,我会把链接附在对应的条目上。如果已经完成的话,请在下面跟贴并以文本形式把代码贴上来,后面的我来处理。
Projects =====================================================
魔方求解 Rubik's Cube Solver::Marveloustau::未完成
一个解3阶魔方的小程序。这是我现在做的毕业设计项目,事实上这个最终是要用乐高的Mindstorm机器人解一个真正的魔方,但是求解魔方的操作序列和计算机上的模拟都是用Mathematica实现的。魔方的状态非常多,并且旋转到最后需要小心地设计规则才能将为了将未归位的魔方小块儿复原而破坏的已经复原的小块儿再度复原(这句话是比较费解,但是如果你拧过魔方应该有这个体会)。关于拧魔方你可以参考这里,Roman E. Maeder(就是Computer Science with Mathematica的作者)写的一个demonstration。注意,这个demonstration仅仅是为你提供一个操作环境,而它自己并没有求解能力。
一个simple-stupid的实现
- Clear[Lcounter, Rcounter, Fcounter, Bcounter, Ucounter, Dcounter,
- Matrix, FinalMatrix];
- ClearSystemCache[];
- Lcounter :=
- Do[{FinalMatrix[[1]], FinalMatrix[[2, 1]], FinalMatrix[[3, 1]],
- FinalMatrix[[5, 1]], FinalMatrix[[6, 1]]} =
- Map[#.RotationMatrix[Pi/90, {1, 0, 0}] &, {FinalMatrix[[1]],
- FinalMatrix[[2, 1]], FinalMatrix[[3, 1]], FinalMatrix[[5, 1]],
- FinalMatrix[[6, 1]]}, {-2}], {i, 45}];
- (*The adjacent faces of left (1) are 2, 3, 5 and 6, while all \
- adjacent facets which need to rotate are on the higher depth of the \
- table*)
- Rcounter :=
- Do[{FinalMatrix[[4]], FinalMatrix[[2, 3]], FinalMatrix[[3, 3]],
- FinalMatrix[[5, 3]], FinalMatrix[[6, 3]]} =
- Map[#.RotationMatrix[Pi/90, {-1, 0, 0}] &, {FinalMatrix[[4]],
- FinalMatrix[[2, 3]], FinalMatrix[[3, 3]], FinalMatrix[[5, 3]],
- FinalMatrix[[6, 3]]}, {-2}], {i, 45}];
- (*Same to L*)
- Fcounter :=
- Do[{FinalMatrix[[2]], FinalMatrix[[1, 1]], FinalMatrix[[3, All, 1]],
- FinalMatrix[[4, 1]], FinalMatrix[[6, All, 1]]} =
- Map[#.RotationMatrix[Pi/90, {0, 1, 0}] &, {FinalMatrix[[2]],
- FinalMatrix[[1, 1]], FinalMatrix[[3, All, 1]],
- FinalMatrix[[4, 1]], FinalMatrix[[6, All, 1]]}, {-2}], {i,
- 45}];
- (*Need to change 3 and 6 because affected facets are on same column \
- but not row*)
- Bcounter :=
- Do[{FinalMatrix[[5]], FinalMatrix[[1, 3]], FinalMatrix[[3, All, 3]],
- FinalMatrix[[4, 3]], FinalMatrix[[6, All, 3]]} =
- Map[#.RotationMatrix[Pi/90, {0, -1, 0}] &, {FinalMatrix[[5]],
- FinalMatrix[[1, 3]], FinalMatrix[[3, All, 3]],
- FinalMatrix[[4, 3]], FinalMatrix[[6, All, 3]]}, {-2}], {i,
- 45}];
- Ucounter :=
- Do[{FinalMatrix[[6]], FinalMatrix[[1, All, 3]],
- FinalMatrix[[2, All, 3]], FinalMatrix[[4, All, 3]],
- FinalMatrix[[5, All, 3]]} =
- Map[#.RotationMatrix[Pi/90, {0, 0, 1}] &, {FinalMatrix[[6]],
- FinalMatrix[[1, All, 3]], FinalMatrix[[2, All, 3]],
- FinalMatrix[[4, All, 3]], FinalMatrix[[5, All, 3]]}, {-2}], {i,
- 45}]
- Dcounter :=
- Do[{FinalMatrix[[3]], FinalMatrix[[1, All, 1]],
- FinalMatrix[[2, All, 1]], FinalMatrix[[4, All, 1]],
- FinalMatrix[[5, All, 1]]} =
- Map[#.RotationMatrix[Pi/90, {0, 0, 1}] &, {FinalMatrix[[3]],
- FinalMatrix[[1, All, 1]], FinalMatrix[[2, All, 1]],
- FinalMatrix[[4, All, 1]], FinalMatrix[[5, All, 1]]}, {-2}], {i,
- 45}];
- Matrix = Map[
- Function[x,
- Map[x + # &, {{-1.5, -1.5}, {-0.5, -1.5}, {-0.5, -0.5}, {-1.5, \
- -0.5}}]], {{{0, 0}, {0, 1}, {0, 2}}, {{1, 0}, {1, 1}, {1, 2}}, {{2,
- 0}, {2, 1}, {2, 2}}}, {-2}];
- FinalMatrix =
- Flatten[Table[
- Map[Insert[#, i, j] &,
- Matrix, {-2}], {i, {-1.5, 1.5}}, {j, {1, 2, 3}}], 1];
- (*FinalMatrix第一层为六个面,顺序为左右后前下上,第二层为每个面的一行三个块,第三层为每行的三个小正方形,第四层为么个小正方形的\
- 四个定点坐标*)
- Dynamic[Graphics3D[{Riffle[
- {Yellow, Green, Red, White, Blue, Orange},
- Map[Polygon, FinalMatrix, {-3}]]}, Boxed -> False,
- PlotRange -> 2.5]]
复制代码 3D-Weighted Voronoi Diagram :: Marveloustau:: 未完成
Voronoi Diagram是计算几何的一个分支。一般意义的Voronoi Diagram是一种对平面或者空间的剖分。简单地说,就是对于一个平面,并已知平面上的几个点Sn(它被称作“母点”),现在对平面进行划分,使得划分后的每一个区域都满足这个区域内所有的点都到这个区域所包含的母点距离最短(欧几里德距离)。它也很容易拓展到三维空间。对于加权情形,那么就是平面上的点到所有母点的距离需要乘以不同的系数。具体的查维基百科上的Voronoi Diagram条目就很明白了。
(左图为2D)(左图为3D)
[ 本帖最后由 marveloustau 于 2009-1-15 17:34 编辑 ]
加权Voronoi图的加权方式分additive和multiplicative两种,均可在Weighted Voronoi Diagram的相关资料中找到。这里是把multiplicative方式的Weighted Voronoi Diagram扩展到了三维空间。看起来就像一堆内部气压不同的泡沫。
因为我机子太烂所以没办法渲染更多的小球了。 :(
这个项目没有用Mathematica完成,而是直接使用了基于C的OpenGL编程,当时考虑这么做的原因是Mathematica渲染多边形很慢,而且中间经过一层Java的环节我的机子跑不起来。但是OpenGL的渲染同样存在问题,就是不能同时开启半透明和深度检测,所以颜色看起来会有一些问题,本来应该是在下面的看起来却在上面,解决方法是实时对渲染对象按照深度排序,可是那样会比较慢,而且会用到动态内存。而在C中的动态内存比较危险,所以我就偷了下懒。嘿嘿嘿
很长一段时间没在Mathematica版出现,是因为参与了一个关于自然语言处理的项目,所以去学了Erlang以及Unix下面很多用正则表达式处理文本的小工具,当然还有C语言。当时几乎想放弃这个了,但是到后来发现其实可以做。前后花了两个月的时间才搞定,是够笨的。另外就是因为申请学校耽搁了一些时间,其实是大部分时间。哈哈
貌似已经背离了用Mathematica求解问题的初衷了,哎好惭愧啊
好,结题。天哪一年半都过去了。
"No "<>#<>"ains"&/@{"p", "g"} |
|