| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7251 人关注过本帖, 9 人收藏
标题:超级Rubik魔方演示程序源代码及数据结构分析(源代码有修正,20110105版)
只看楼主 加入收藏
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
结帖率:96.15%
收藏(9)
已结贴  问题点数:0 回复次数:46 
超级Rubik魔方演示程序源代码及数据结构分析(源代码有修正,20110105版)
先介绍一下程序:
第一个提示界面:
图片附件: 游客没有浏览图片的权限,请 登录注册


选择好魔方大小后:
图片附件: 游客没有浏览图片的权限,请 登录注册



这个程序能模拟任意的x * y * z尺寸的魔方

可执行程序包(Win32):
魔方.zip (155.45 KB)


修正版源代码工程(即上面的可执行程序包的源代码工程,使用VS2008):
rubik_src.zip (151.27 KB)


老版本源代码工程(有BUG,且方块间无黑边分隔,同使用VS2008):
rubik_src.zip (149.96 KB)



程序的交互:
使用鼠标:
左键:拖放可旋转你所拖动的层(注意拖放和拖动的区别)
右键:拖动可整体旋转整个魔方
滚轮:前进后退,以达到放大缩小的效果

喜欢的就回帖支持一下吧


=====================================================================================
如果你对数据结构分析不感兴趣,可以就此打住了

以下是程序数据结构简要分析





为了能支持任意 x * y * z 的魔方,数据结构及其关联性的定义见结构图:

图片附件: 游客没有浏览图片的权限,请 登录注册


结构的基本作用:

Rubik 结构:对整个魔方的状态控制和逻辑控制,以及渲染控制,它控制三个 Dimension 和 x * y * z 个 Cube
Dimension 结构:维度结构,相当于三个旋转轴,每一个维度结构控制若干个Layer结构
Layer 结构:层,控制本层的旋转,逻辑更新,每一层控制它所在的那一层的全部Cube
Cube 结构:每个独立小方块的逻辑结构,包含六个Face子结构,而每一个Cube都会由三个Layer所控制
Face 结构:渲染控制最小单元,用于绘制一个面,并记录这个面所映射的纹理



主要逻辑流程控制:
Render:  Rubik -> Cube -> Face
Rotate:  Rubik -> Dimension -> Layer -> Cube
Update:  Rubik -> Dimension -> Layer
Pick:    Rubik -> Cube -> Face ->(返回) Rubik -> Dimension -> Layer ->(返回) Rubik -> Rotate



单层Rotate实现:
每个Layer有一个指向本层的全部Cube的指针,通过交换Cube内的数据实现旋转,同时无需同步另两层相应的Cube,因为指向的是同一个Cube
这个不难


Pick实现:
由Rubik与所有Cube的可见面做Pick测试,找到z最小但大于0的Cube及其相应的面
然后根据这个面的编号,比如这个面是属于顶面或者底面的,就只向x维和z维查询这个Cube(因为这时不可能是y轴旋转)
获取所在维和所在层,以及所在层的面,并记录下来
鼠标控制时,就对两次Pick的数据进行比较,查找匹配的层,计算出旋转方向,再调用单层Rotate实现旋转
就是繁琐而已


Pick测试:
就是鼠标的点击生成一条空间直线,与一个空间三角形的碰撞检测


总的来说,所有主循环发起的操作都会通过Rubik结构向下传递,类似消息链


以上就是这个结构模型的简要抽象描述,还有很多细节
比如看起来生成了x * y * z个Cube,实际只有最外一层的Cube受控制
Layer自己根据自己所在层的大小决定旋转90度还是180度,
还有使用map技巧缩短代码等等
不过代码还是有很多地方没整理,有一些地方显得有点乱,将就着吧,我这菜鸟花12小时写的程序就只能这水平了

如果有什么细节上的问题可以线下讨论,见这里白色字: 可以加群127893384

其它:散分
PS:我就喜欢压缩EXE,这个也不例外,要用各种理由找茬的请自便,我不喜欢反驳。
另,继续期待我的朋友愿意和我交真正的朋友


[ 本帖最后由 御坂美琴 于 2011-1-5 20:48 编辑 ]
收到的鲜花
  • 你们都要疼我哦2011-01-10 01:08 送鲜花  -5朵   附言:无理由
  • 马后炮2011-01-10 12:26 送鲜花  6朵   附言:原创内容+好文章
  • a3436374122011-01-10 13:13 送鲜花  10朵   附言:我很赞同
  • a3436374122011-01-10 13:14 送鲜花  10朵  
  • a3436374122011-01-10 13:14 送鲜花  10朵  
  • a3436374122011-01-10 13:15 送鲜花  10朵  
  • a3436374122011-01-10 13:15 送鲜花  10朵  
  • a3436374122011-01-10 13:15 送鲜花  10朵  
  • a3436374122011-01-10 13:15 送鲜花  10朵  
  • a3436374122011-01-10 15:47 送鲜花  1朵  
  • 日的起烟烟2011-01-17 19:38 送鲜花  5朵   附言:太强大了
  • xieshen9472011-01-22 11:24 送鲜花  5朵   附言:谢谢分享哦
搜索更多相关主题的帖子: 源代码 
2010-12-29 17:36
yxdn001
Rank: 2
来 自:江西
等 级:论坛游民
帖 子:12
专家分:17
注 册:2010-12-9
收藏
得分:9 
嗯,下过来看看了
2010-12-29 18:17
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
程序代码:
    int imap[6][4] = 
    {
        {2, 3, 1, 0},
        {3, 7, 0, 4},
        {2, 6, 3, 7},
        {0, 4, 1, 5},
        {1, 5, 2, 6},
        {7, 6, 4, 5},
    };


解释下这么Matrix 为什么这么定义。
2010-12-29 18:38
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:0 
看着很乏味,突然发现散分两字,我来劲了。

悲剧源于生活。
2010-12-29 19:20
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
以下是DW写的在Win下编译出来的程序
MagicCube.zip (256.41 KB)


那个是顶点表,我懒的写enum,数值定义写在了cube.h的注释里

PS:更改了一下附件,之前的忘记发相应的dll了

[ 本帖最后由 御坂美琴 于 2010-12-29 19:41 编辑 ]

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-12-29 19:32
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用御坂美琴在2010-12-29 19:32:07的发言:

以下是DW写的在Win下编译出来的程序


那个是顶点表,我懒的写enum,数值定义写在了cube.h的注释里

PS:更改了一下附件,之前的忘记发相应的dll了



你几纬的顶点?

太不靠谱了。。
2010-12-29 20:59
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:3 
2010-12-29 17:36:02 ????
理论上应该是在学校上课的

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-12-29 21:17
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
真正的朋友 应该以诚相待

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-12-29 21:20
刘定邦
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:687
专家分:1570
注 册:2010-9-21
收藏
得分:9 
学习学习
2010-12-29 22:14
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:18 
炮姐V5   学习交流第一

How are you 怎么是你?
How old are you   怎么老是你?
2010-12-30 14:57
快速回复:超级Rubik魔方演示程序源代码及数据结构分析(源代码有修正,20110105 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020870 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved