zl程序教程

您现在的位置是:首页 >  后端

当前栏目

c++/qt/opencv实现魔方复原【娱乐】

OpencvQtC++ 实现 娱乐 魔方 复原
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步,每一步进入循环一直判断颜色


总结

应用程序体验
源码