| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7251 人关注过本帖, 9 人收藏
标题:超级Rubik魔方演示程序源代码及数据结构分析(源代码有修正,20110105版)
取消只看楼主 加入收藏
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
结帖率:96.15%
收藏(9)
已结贴  问题点数:0 回复次数:3 
超级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
御坂美琴
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
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
发了修正了的源代码了,这个版本看起来也漂亮很多,资源泄露问题也解决了,
鼠标拖放操作也基本不会误判(旧版本缺少在Cube层做z比较导致有BUG),可以自己对比两份代码的差异

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2011-01-05 21:09
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
以下是引用虾B写在2011-1-6 18:09:12的发言:

看完效果想到一个问题
 
不知道能否用二分法来判断鼠标是否在么一个图形内,一个一个图形判断好像太慢.可是怎么根据N多图形的点坐标划分成两个图形来找呢?
这要看情况,有的情况下不行,有的情况可以
比如你的地面,用一个八叉树记录的话,那是可以用树查找达到logn级别的,这是对于不会运动的对象
如果是运动的对象,那按对象坐标组织一棵树也要nlogn,除非你实时维护这棵树,但这样难度更大
不过,多数情况下,你pick检测一帧最多一次,计算量相对于其它东西不算多,一般不会花太多力气在pick上做优化
当然你可以使用shader方式把对象数据直接渲染在缓冲区,这样再pick可以实现像素级精确pick,这也是opengl所支持的做法

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2011-01-06 18:21
快速回复:超级Rubik魔方演示程序源代码及数据结构分析(源代码有修正,20110105 ...
数据加载中...
 
   



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

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