魔方吧·中文魔方俱乐部

标题: Twisty Star JAVA模拟器 (五个四面体的组合) [打印本页]

作者: schuma    时间: 2012-5-9 07:56:32     标题: Twisty Star JAVA模拟器 (五个四面体的组合)

大家好,


我一直很喜欢五个四面体的组合”[http://en.wikipedia.org/wiki/Compound_of_five_tetrahedra]这个几何形体。我大一的时候还用尺规作图很仔细的在小本本上画过这个东西。它和正十二面体有密切的联系,它有互为镜像的两个版本,它的样子也挺好看的。总之我很喜欢这个东西。


不过至今我还没见过基于这个形状的魔方。最近受到Leslie LeSuperStar的鼓励,我打算写个Java模拟器。这也是我学写JavaApplet的好机会。现在写好了,打开这个网址就行了:

[http://people.bu.edu/nanma/TwistyStar/TwistyStar.html]


如果你看不到的话,很可能要更新Java运行环境(JRE)。我管它叫Twisty Star (拧巴星),既因为它是个魔方所以可以拧,也因为它的形状看起来比较拧巴。下面是还原状态和一个打乱状态的截图:
初始状态.png 打乱状态.png

它由五个正四面体构成,这五个四面体互相交错在一起。它的二十个顶点就是正十二面体的顶点。五个四面体很自然的被涂上了五种颜色。

它可以围绕二十个顶点旋转,是转角魔方。因为切面刚好在四面体的面的上方,与面平行,所以说它是转面魔方也有道理。换种说法的话,这个几何形体的对偶就是它的镜像。所以它基本上是自己和自己对偶的。所以它的顶点和面有一一对应的关系。所以它既是转角也是转面魔方就好理解了。和那些正多面体魔方比较的话,它属于转面二十面体那一类的。

Java模拟器里,鼠标悬停在它上面时,可以拧的那个顶点用一个小圈标出了,旋转的区域也用高亮表示。虽然有这些辅助效果,还是很难观察它到底是怎么转的。有时候,在就差一步就还原的状态下,我看来看去也不知道怎么把它还原。我还没从正式的打乱状态开始把它还原过。在这种配色下,我猜有不止一种还原态。也就是说,只交换红色四面体和蓝色四面体,应该是可行的。

各位制作魔方的大师们,你们觉得把这个东西做出实物来有希望么?它挺好看的,而且不是太难解,应该会有不少人喜欢吧。至少我想要一个!

我想感谢胡波老师。要不是他编写的那一系列Java模拟器,我也不会想要编这个东西的。希望我以后能像他似的,多为论坛做贡献。

如果大家看见有什么bug就告诉我。已知的一个问题是遮挡关系处理的不太好。有的线条应该被挡住的,却背画出来了。我以后研究研究更复杂的几何算法来处理这个事吧。

-- schuma

[ 本帖最后由 schuma 于 2012-5-9 08:00 编辑 ]

附件: 初始状态.png (2012-5-9 07:56:32, 20.49 KB) / 下载次数 2
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=MTgxMTUyfDU2NjIxZDhjfDE3MzM5NjgxNzZ8MHww

附件: 打乱状态.png (2012-5-9 07:56:32, 20.89 KB) / 下载次数 3
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=MTgxMTUzfGZjMzkxMDRmfDE3MzM5NjgxNzZ8MHww
作者: xwfh2000    时间: 2012-5-9 08:04:09

这个很有创意,schuma大师从解魔方达人开始向全能转化了,支持!
作者: 魔嗜    时间: 2012-5-9 09:05:30

很漂亮啊,支持一下……
作者: Cielo    时间: 2012-5-9 09:39:19

支持,好难的魔方
作者: 大烟头    时间: 2012-5-9 10:12:00

魔方可分为形变类与非形变类,非形变类的魔方血统更纯正,零件统一便于量产。

这拧巴星很有创意,外观虽然有点吓人,但却属非形变类魔方,这个很难得。

初步分析:20轴魔方,有3个簇,其中一个簇有20个块,另两个簇有60个块
作者: schuma    时间: 2012-5-9 10:13:24

原帖由 大烟头 于 2012-5-9 10:12 发表
这拧巴星很有创意,外观虽然有点吓人,但却属非形变类魔方,这个很难得。

多谢。这个东西外观很新奇,不过实质是很传统的。
作者: sokoban    时间: 2012-5-9 10:13:59

厉害!发了一条微博。

3D图形都是自己计算显示的吗?还是有什么类?

[ 本帖最后由 sokoban 于 2012-5-9 10:16 编辑 ]
作者: schuma    时间: 2012-5-9 10:19:05     标题: 回复 7# 的帖子

基本都是自己计算的吧。画图方面基本就靠 drawPolygon 来画二位多边形。鼠标拖动带来的三维旋转也是自己算的。就是因为方法比较基本,所以画图效果有瑕疵。不知道胡波老师用了哪些函数啊。
作者: 大烟头    时间: 2012-5-9 10:22:27

20轴魔方会出现混乱旋转,这时会形变,传统旋转情况下是不会形变的
作者: schuma    时间: 2012-5-9 10:27:21

原帖由 大烟头 于 2012-5-9 10:22 发表
20轴魔方会出现混乱旋转,这时会形变,转统旋转情况下是不会形变的

是啊,我知道这个事情,转面二十面体有这个情况。如果只做120度旋转那就不会形变。不过转到别的角度,能不能继续转其他的轴,是不是得做实物来才好最后判定啊?
作者: 乌木    时间: 2012-5-9 11:00:35

复原态的这五处小三角形是什么情况?看来,虽然小三角形的颜色不同,但是仍在同一平面中,也就是小三角形处并无一个小的刻缺,对吧?
这五处小三角形是什么?.png

[ 本帖最后由 乌木 于 2012-5-9 11:16 编辑 ]

附件: 这五处小三角形是什么?.png (2012-5-9 11:00:35, 29.1 KB) / 下载次数 0
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=MTgxMTU0fGUyYjU4MGRhfDE3MzM5NjgxNzZ8MHww
作者: hubo5563    时间: 2012-5-9 11:24:09

我编的java也没有用java3d功能,模型建立,消隐都是自己计算的,主要用到java2d的绘图功能,消除显示时的锯齿是用这个函数实现的:
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

这是画一个完整魔方子程序:

//画一个完整的魔方

void  xianshimq(Graphics gg)
{
     int i,j;
     if(ogg==null){
             ogg=createImage(width,height);
     };
     int m;
     boolean zxflag=false;
     Graphics og=ogg.getGraphics();
     og.setClip(0,0,width,height);
     og.setColor(bgColor);
     og.fillRect(0, 0, width, height);
     Graphics2D g2 = (Graphics2D)og;
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);      
       //for(i=26;i<27;i++)
       for(i=0;i<zongkuaishu;i++)
       {
        showmian(g2,moqiu);
       };
       xianshigongshiye(og);
        gg.setClip(0,top,width,height);
        gg.drawImage(ogg,0,top,null);
};
其中showmian(g2,moqiu);
xianshigongshiye(og);
是自己编的。
作者: schuma    时间: 2012-5-9 11:24:57     标题: 回复 11# 的帖子

你说的这几个,就是绘图的bug,不应该有那几条线的。颜色的不同只是因为光照效果的原因。这里一共就五种颜色,不分深黄浅黄之类的。
作者: schuma    时间: 2012-5-9 11:29:36     标题: 回复 12# 的帖子

多谢你的回复。antialiasing我试过,不过动画弄得不太流畅,所以就没采用。回头我再试试看。

showmian() 里应该有消隐的算法吧。要决定先画那个多边形,后画哪个之类的。大概是什么思路呢?从远到近画?
作者: hubo5563    时间: 2012-5-9 11:49:11

在调用showmian()之前先排序,这是排过顺序的,显示时要结合显示的面的法向量,不能显示的就不显示了,先画远处的再画近处的,就是画家算法消隐。
作者: honglei    时间: 2012-5-9 12:27:49

这个魔方很难观察,调整好方向之后,只有两种块.
作者: schuma    时间: 2012-5-9 12:52:08

好主意。不过我试了一下还是想画那些法矢量朝后的,否则动画效果有种支离破碎的感觉。现在把那些画成灰色的了。

然后我改了一下多边形中心的算法,现在那个地方已经不会出现之前的那个毛病了。

Image 000.png

附件: Image 000.png (2012-5-9 12:52:08, 2.66 KB) / 下载次数 1
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=MTgxMTU1fDhlNWVmMDczfDE3MzM5NjgxNzZ8MHww
作者: zyytlzlb    时间: 2012-5-9 13:47:58     标题: 期待

我们很期待你 能多做出现在市面上常见的一些异型魔方的模拟器,来帮助一些像我这样的初级魔法爱好者
作者: schuma    时间: 2012-5-9 15:33:24

呼呼,花了两个半小时,终于解开了。中间出了很多次错误,多亏了有 撤销 按钮,才不至于从头再来...

有了一些经验以后,发现鼠标选的点和对应的顶点之间的对应关系还是不太自然,没达到想转哪儿就转哪儿的程度。我还要慢慢调试啊
作者: schuma    时间: 2012-5-9 16:08:16

刚才我把十几年前的笔记本翻出来了。这是我当时尺规作图画的图。它是这个applet里的形体的镜像。
photo_resized.jpg


我改天给applet加一个镜像按钮

附件: photo_resized.jpg (2012-5-9 16:08:16, 39.83 KB) / 下载次数 0
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=MTgxMTU3fGQxYzI3MjQ3fDE3MzM5NjgxNzZ8MHww
作者: 罗伯斯·李    时间: 2012-5-9 18:03:26

我感觉这种异形虽然诡异,但好像没什么意义啊!颜色和面越来越多,转起来又很难接受,估计也不好拆装,但还是要顶一下
作者: sokoban    时间: 2012-5-9 18:14:15     标题: 回复 12# 的帖子

多谢胡波老师的介绍,很有意思。
作者: schuma    时间: 2012-5-10 15:13:27

我今天又加了一些功能。比如增加了一个 “镜像” 按钮,同时用背景颜色表示是不是解好了。比较有用的一个功能是可以选择只显示某些类型的块,这个功能比较有利于观察。同时也检测某类型的块是不是解好了,这样如果按类型解的时候,过程中出错了可以及时发现。
下图是只显示两类块的效果,还挺酷的吧,呵呵?
Image 000.png

附件: Image 000.png (2012-5-10 15:13:27, 28.14 KB) / 下载次数 1
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=MTgxMjAwfGFjZDg3OTY5fDE3MzM5NjgxNzZ8MHww
作者: honglei    时间: 2012-5-11 20:19:56

这个功能好,我解的一些块多的五魔方以用华丽魔方,就用了填色的功能,把暂时用不着的块都给填成灰色.

原帖由 schuma 于 2012-5-12 05:55 发表
在打乱的魔方上填色?填成灰色的时候还好,不过要把灰色还原成彩色的时候,它会自动找到当初的颜色么?

先把魔方回到复原状态,把先不复原的块染成灰色.点F7输出参数,加入java助手可选参数里,
等需要把这些块复原的时候,再把参数清空就行了.

[ 本帖最后由 honglei 于 2012-5-13 06:51 编辑 ]
作者: schuma    时间: 2012-5-12 05:55:39     标题: 回复 24# 的帖子

在打乱的魔方上填色?填成灰色的时候还好,不过要把灰色还原成彩色的时候,它会自动找到当初的颜色么?
作者: csgg    时间: 2012-5-12 10:34:46

支持,这个貌似是真3D的。
作者: schuma    时间: 2012-5-12 11:02:39

真3D? 啥是假3D的?
作者: csgg    时间: 2012-5-12 11:28:44     标题: 回复 27# 的帖子

胡波老师那个系列的我觉得更像是2D的……
作者: hubo5563    时间: 2012-5-12 11:41:48     标题: 回复 28# 的帖子

显示器本来就是2D的,任何3D物体都是投影到2D显示窗口显示的。
其实我的所有魔方模型都是3D模型,存储的都是3D坐标。
作者: schuma    时间: 2012-5-12 11:57:59     标题: 回复 29# 的帖子

我觉得区别可能在于胡波老师的applet画线条的时候用了antialiasing。其实线条是更连续更清楚了,不过看起来有点像动画片的效果。也许因为这个原因,有一种2D的错觉吧。
作者: hubo5563    时间: 2012-5-12 12:36:49

不是,是我处理光照时的对比度小了,明暗效果不是特别明显。
作者: schuma    时间: 2012-5-12 12:44:10

嗯,有道理。看来当初Melinda Green 敦促我给它加上光照效果是个不错的建议。不过如果颜色比较多的话,还是不加光照比较好,否则相似的颜色比较容易混淆。

我今天加了一点透视投影的效果,于是不再是正投影了。
作者: hubo5563    时间: 2012-5-12 12:48:25

不是没有加光照,是对比度不大。

[DWMFjava=450,400]
[param=Order]1[/param]
[param=Speed]10[/param]
[param=bgcolor]f3a0e2[/param]
[param=butbgcolor]99d658[/param]
[param=FaceU]ddddddddddd[/param]
[param=FaceF]ddddddddddd[/param]
[param=FaceL]ddddddddddd[/param]
[param=FaceJ]ddddddddddd[/param]
[param=FaceB]ddddddddddd[/param]
[param=FaceR]ddddddddddd[/param]
[param=FaceW]ddddddddddd[/param]
[param=FaceV]ddddddddddd[/param]
[param=FaceZ]ddddddddddd[/param]
[param=FaceY]ddddddddddd[/param]
[param=FaceX]ddddddddddd[/param]
[param=FaceD]ddddddddddd[/param]
[/DWMFjava]


[MZMjava=450,400]
[param=Order]1[/param]
[param=Speed]10[/param]
[param=bgcolor]f3a0e2[/param]
[param=butbgcolor]99d658[/param]
[param=FaceU]99999999999999999999[/param]
[param=FaceF]99999999999999999999[/param]
[param=FaceL]99999999999999999999[/param]
[param=FaceB]99999999999999999999[/param]
[param=FaceR]99999999999999999999[/param]
[param=FaceD]99999999999999999999[/param]
[/MZMjava]


从这个单色的可以看出明暗效果不是太强烈,主要是为了好认颜色特意做成这样的。

[ 本帖最后由 hubo5563 于 2012-5-12 13:05 编辑 ]




欢迎光临 魔方吧·中文魔方俱乐部 (http://bbs.mf8-china.com/) Powered by Discuz! X2