嗨!这里是蜜糖~~
蜜糖相信很多人在学生时期应该都玩过魔方,上大学或者工作之后却玩的很少了,所以今天蜜糖就给大家带来一款与众不同的魔方——代码版魔方,有电脑就能玩~莱茨狗
看到这个你是不是心动了呢,不要急,因为代码比较多,所以我就不贴出来了,结尾放了文件,感兴趣的小伙伴可以自行下载研究,蜜糖这里给大家简单的讲解一下,方便大家理解。
文字有点难以理解,可以根据代码来进行学习~
操作方法
1.鼠标左键拖动能观察不同角度下的魔方。
2.鼠标右键拖动能拧动魔方。
简单说明
这个程序主要讲如何判断哪些面是要展示出来的以及如何判断点在哪个面的哪个小平面上,以及旋转时的逻辑。
要判断哪些面是要展示出来的,就需要投影面的法向量 m 和每个面的法向量 n,若 m * n 为负数,说明这两个向量夹角为钝角,也就是不用展示出来,反之就要展示出来。
数学基础就这么两句话,但是要用代码实现出来得有几十行,这里我将魔方 8 个顶点固定住,6 个面的法向量也是固定的,略一计算,我们只需要根据投影面的法向量的 x,y,z 值的正负就能判断 6 个面中哪些面是要展示出来的。
这里判断正负要注意,c 语言中的浮点数无法表示 0,最接近 0 的浮点数是 2^(-128),因此浮点数的 0 会比 0 略大或者略小,我这里用一个宏 ZERO 表示 0,只要浮点数比这个宏大就是大于 0。
同时在透视投影中,当观察点没有倾斜一定角度无法看到侧面,这个倾斜的角度的 cos 值为魔方边长的一半除以观察点到投影面的距离。
也就是当观察点在某一个平面上,就只能看到距离最近的两个点形成的直线,看不到这个平面上的其他点。这时候 ZERO 值就表示能看到侧面的最小 cos 值。
判断点在哪个面的哪个小平面上需要建一个模型,不然你不知道一个平面的起点在哪里,也就不能判断每个小平面的位置。
魔方的 8 个顶点中,头四个表示底部,尾四个表示顶部,逆时针挨个排序,在空间直角坐标系中,魔方中心点为原点,x 轴正方向为右边平面的法向量,也就是 Right