[问题] 绕两轴旋转

楼主: jurian0101 (Hysterisis)   2014-05-16 03:54:22
自从上次数方块游戏之后就在想花样
例如说使方块在空间中自动旋转,同时要求计数(邪恶貌)
那就要要生成适合计算的随机方块阵形
我采用的方法是以 {0,0,0} 为中心 向六个方向
dir= {{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
随机往外生出新方块
== == 总之,代码如下 == == <下载: https://db.tt/pz06VBBg 伪‧大分子产生器 >
Clear["Global`*"];
adjLimit = 4;
(*设定方块彼此间能多拥挤*)
dir = {{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
pos = pos2 = {{0,0,0}}
adj[x_] := Cases[pos, _?(EuclideanDistance[x, #] == 1 &)];
(*找出某方块x--可以不在pos中--的周围已有哪些方块。配合Length使用*)
(*放个Dynamic,可以实时观赏方块冒出来,很赏心悦目*)
Dynamic[Graphics3D[
{Hue[1.*#2/4 + 0.1],
(* /4代表会有4种颜色, +0.1是在微调色调,有点随意 *)
Cuboid[#1 - {0.5, 0.5, 0.5} - Mean[pos]]} & @@@ (*将图形调整至原点重心*)
MapThread[List, {pos, Range[Length@pos]}],
(*这里只是想让依序产生出来的方块能在四种颜色之间循环,得以区别。
可设3,5以上眼花花*)
Axes -> False, Boxed -> False,
Lighting-> {{"Ambient", White}}, (*此项参数让方块旋转时色调不会有阴影变化*)
SphericalRegion -> True (*此项使周边留足够空白,怎么旋转都不会被切边*)
]]
(*实际产生新方块*)
Do[out = Catch[
While[True,
stem = RandomChoice[pos2]; (*pos2是尚未达到与3个方块相邻者*)
rnd = stem + RandomChoice[dir]; (*取一dir*)
adj1 = Length@adj[rnd]; (*和rnd相邻*)
adj2 = Length /@ (adj /@ adj[rnd]); (*和rnd相邻的相邻数*)
If[! MemberQ[pos, rnd] && adj1 <= adjLimit &&
Max@adj2 <= adjLimit - 1, Throw[rnd]];
]];
(*用意是方块太挤很难计算,adjLimit= 3 or 4,设为5形状笨拙,6等于没设,
2只可能变成长蛇状 ^o^ *)
(*Throw + Catch 配合无穷循环或须穷举时的复杂、巢状循环非常好用,
虽然这在其他语言是很异类的写法。似乎是内存管理上会有问题...
我不是很懂。*)
AppendTo[pos, out];
If[adj1 <= adjLimit - 1(*还可以再分出*), AppendTo[pos2, out]];
pos2 = Complement[pos2,
Cases[Intersection[pos2,
adj[rnd]], _?(Length@adj[#] >= adjLimit &)]];
(*pos2的存在是要削减选择跟比较的空间,做到加速*)
,{59} (*目标方块数-1*) ];
到此为止都颇有心得。
不过,我想请教的问题是,我不知道怎么利用 ViewPoint 参数,就像
ViewPoint的说明文件中应用范例那样,使得图形旋转!
而且与范例不同的是,我必须使图形同时对两个轴旋转(像电影世界末日那颗陨石)
因为这样才能看清楚所有角度。 ^^^^^^
我用了RotationTransform,目前好像是卡在旋转不可交换,用两个相垂直的轴同时
旋转,只会得到古怪的jiggle效果。
拜托给建议了

Links booklink

Contact Us: admin [ a t ] ucptt.com