c++/qt/opencv实现魔方复原【娱乐】
2023-09-27 14:21:00 时间
前言
本文主要是对魔方还原进行测试,并且可通过键盘玩转魔方,然后自动还原,本次项目用
到opengl
视频演示
c++/qt/opengl魔方复原功能
一、项目工程目录
cube和GLWidget文件主要是界面的opengl和魔方矩阵的定义
openglTest为主逻辑
二、重要代码解析
1.Cube方块类
首先枚举各面的颜色
enum Color{white,yellow,blue,green,orage,red};
初始化每个方块各面
void Cube::initColor()
{
color[Cube::front] = Cube::white;
color[Cube::back] = Cube::yellow;
color[Cube::down] = Cube::blue;
color[Cube::up] = Cube::green;
color[Cube::right] = Cube::orage;
color[Cube::left] = Cube::red;
}
方块位置设置
void Cube::setXYZ(GLfloat x1, GLfloat y1, GLfloat z1)
{
x=x1;
y=y1;
z=z1;
}
2.GLWidget界面构建
这里主要使用opengl来进行设置
初始化opengl
void GLWidget::initializeGL()
{
//初始化进来
loadGLTextures(); //加载资源文件图像
glEnable( GL_TEXTURE_2D ); //glEnable启用各种功能,启动目标纹理,不能写在glBegin和glEnd两个函数中间;
glShadeModel( GL_SMOOTH ); //设置着色模式 GL_SMOOTH会出现过渡效果,GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点
glClearColor( 0.5,0.5, 0.5, 0.5 ); //设置清除颜色,也类似与背景颜色
glClearDepth( 1.0 ); //指定深度缓冲区中每个像素需要的值
glEnable( GL_DEPTH_TEST ); //启用了之后,OpenGL在绘制的时候就会检查,当前像素前面是否有别的像素,如果别的像素挡道了它,那它就不会绘制,也就是说,OpenGL就只绘制最前面的一层
//透明操作
//glDisable(GL_DEPTH_TEST); //需要关闭它
//glEnable(GL_BLEND); //打开混合
glDepthFunc(GL_LEQUAL); //GL_LEQUAL:深度小或相等的时候也渲染 GL_LESS:深度小的时候才渲染
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); //第三个参数:GL_FASTEST为使用速度最快的模式. GL_NICEST为使用质量最好的模式,还有一个GL_DONT_CARE为由驱动设备来决定
glEnable(GL_LIGHT1); //光照参数
}
绘制方块,魔方立体
void GLWidget::drawOneCube(Cube *b, GLfloat x, GLfloat y, GLfloat z)//
{
x=x-0.5;
y=y-0.5;
z=z-0.5;
const Cube::Color *color = b->getColor();
//后面 黄色
glBindTexture( GL_TEXTURE_2D, texture[color[1]] );
glBegin( GL_QUADS ); //填充颜色
glNormal3f( x, y, z ); //设置法向量指向哪里
//glTexCoord2f:第一个参数代表X坐标。 0.0f 是纹理的左侧。 0.5f 是纹理的中点, 1.0f 是纹理的右侧
// 第二个参数代表Y坐标。 0.0f 是纹理的底部。 0.5f 是纹理的中点, 1.0f 是纹理的顶部
//glTexCoord2f()是配置纹理坐标,glVertex3f()是配置图形坐标,绘制图形时指定纹理的坐标
glTexCoord2f( 0, 0 );glVertex3f(x, y, z);
glTexCoord2f( 0+1, 0 );glVertex3f(x+1, y, z);
glTexCoord2f( 0+1, 0+1);glVertex3f(x+1, y+1, z);
glTexCoord2f( 0, 0+1);glVertex3f(x, y+1, z);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[color[0]] );
glBegin( GL_QUADS );
//前面 白色
glNormal3f( x, y, z+1 );
glTexCoord2f( 0, 0 );glVertex3f(x, y, z+1);
glTexCoord2f( 0+1, 0 );glVertex3f(x+1, y, z+1);
glTexCoord2f( 0+1, 0+1);glVertex3f(x+1, y+1, z+1);
glTexCoord2f( 0, 0+1);glVertex3f(x, y+1, z+1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[color[2]] );
glBegin( GL_QUADS );
//下面 蓝色
glNormal3f( x, y, z);
glTexCoord2f( 0, 0 );glVertex3f(x, y, z);
glTexCoord2f( 0+1, 0 );glVertex3f(x+1, y, z);
glTexCoord2f( 0+1, 0+1);glVertex3f(x+1, y, z+1);
glTexCoord2f( 0, 0+1);glVertex3f(x, y, z+1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[color[3]] );
glBegin( GL_QUADS );
//上面 绿色
glNormal3f( x, y+1, z);
glTexCoord2f( 0, 0 );glVertex3f(x, y+1, z);
glTexCoord2f( 0+1, 0 );glVertex3f(x+1, y+1, z);
glTexCoord2f( 0+1, 0+1);glVertex3f(x+1, y+1, z+1);
glTexCoord2f( 0, 0+1);glVertex3f(x, y+1, z+1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[color[5]] );
glBegin( GL_QUADS );
//左面 橙色
glNormal3f( x, y, z);
glTexCoord2f( 0, 0 );glVertex3f(x, y, z);
glTexCoord2f( 0+1, 0 );glVertex3f(x, y+1, z);
glTexCoord2f( 0+1, 0+1);glVertex3f(x, y+1, z+1);
glTexCoord2f( 0, 0+1);glVertex3f(x, y, z+1);
glEnd();
glBindTexture( GL_TEXTURE_2D, texture[color[4]] );
glBegin( GL_QUADS );
//右面 红色
glNormal3f( x+1, y, z);
glTexCoord2f( 0, 0 );glVertex3f(x+1, y, z);
glTexCoord2f( 0+1, 0 );glVertex3f(x+1, y+1, z);
glTexCoord2f( 0+1, 0+1);glVertex3f(x+1, y+1, z+1);
glTexCoord2f( 0, 0+1);glVertex3f(x+1, y, z+1);
glEnd();
}
3.魔方还原
还原主入口
void OpenGLTest::on_QAction_AutoFinish_triggered()
{
StartRunFlag = true;
ui.statusBar->showMessage(QStringLiteral("开始复原"));
listRotateTempTask.clear();
//第一步白色十字
autoBackCenter();
while(!calAutoBack1())
{
if(autoBack1zthird())break;
if(autoBack1xthird())break;
if(autoBack1xfirst())break;
if(autoBack1yfirst())break;
if(autoBack1ythird())break;
sleep(10);
}
autoBack1Last();
//第二步对好第一面加上四个侧面的T字形
autoBack2();
//第三步处理第二层的四个棱色块,对好前两层
autoBack3();
//第四步在新的黄色顶面画十字
autoBack4();
//第五步调整顶层角色块的朝向,对好顶层黄色面
autoBack5();
//第六步 调整顶层角色块顺序
autoBack6();
//第七步调整顶层棱色块顺序,将魔方最后还原
autoBack7();
ui.statusBar->showMessage(QStringLiteral("完成"));
StartRunFlag =false;
}
这里对魔方复原需要7步,每一步进入循环一直判断颜色
总结
相关文章
- opencv学习笔记(二)寻找轮廓
- 截止2022-06-05,可以用Python的Pip命令安装OpenCV的哪些版本?
- 利用CMake生成OpenCV-3.2.0的VS2013工程(解决方案)的失败过程记录...
- 详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGMG,并利用它实现对道路监控视频前景的提取
- 详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::BackgroundSubtractorMOG2,并利用它实现对道路监控视频前景/背景的提取
- OpenCV中的Vec3b、Vec2i、Vec3f等是什么意思?
- 图像处理作窗口运算时边界的几种扩展方法(详解OpenCV中的参数borderType)
- Qt调用OpenCV汇总(1)
- C++的Opencv动态库遇到的问题
- 【OpenCV】直方图应用:直方图均衡化,直方图匹配,对比直方图
- qt调用opencv汇总(2)
- 在matlab和opencv中分别实现稀疏表示
- Ubuntu16.04下python3.5和C++安装 / 卸载opencv
- 使用卷积神经网络和 OpenCV 实时求解数独(教程含源码)
- OpenCV学习笔记之课后习题练习3-4
- OpenCV:图像的颜色空间转换
- OpenCV:图像的按位运算
- Qt OpenCV Support Image Type 支持读写的图像格式