qt+opengl 实现纹理贴图,平移旋转,绘制三角形,方形

1 首先qt 已经封装了opengl,那么我们就可以直接用了,这里面有三个函数需要继承

virtual void initializeGL() override;
virtual void resizeGL(int w,int h) override;
virtual void paintGL() override;

这三个函数是实现opengl的重要函数。

2 我们需要写GLSL语句

static const char *vertexShaderSource ="#version 330\n""layout (location = 0) in vec3 aPos;\n"     // 位置变量的属性位置值为0"layout (location = 1) in vec3 aColor;\n"     // 颜色变量的属性位置值为1"layout (location = 2) in vec2 aTexCoord;\n"  //纹理变量的属性位置值为2"out vec3 ourColor;\n"                     // 为片段着色器指定一个颜色输出"out vec2 TexCoord;\n"                     // 为片段着色器指定一个纹理输出  "void main(){\n""gl_Position =  vec4(aPos, 1.0);\n"    //顶点信息为4个值向量   // 注意我们如何把一个vec3作为vec4的构造器的参数"ourColor = aColor;\n"        // 输出颜色变量==输入颜色"TexCoord = aTexCoord;\n"    // 输出纹理变量==输入纹理"}\n";static const char *fragmentShaderSource ="#version 330\n""out vec4 FragColor;\n"     //输出颜色"in vec3 ourColor;\n"      //输入的颜色== vertexShaderSource(这里面的输入颜色)"in vec2 TexCoord;\n"      //输入的纹理== vertexShaderSource(这里面的输入纹理)"uniform sampler2D texture1;\n"  //得到输入的纹理     "void main()""{\n""FragColor = texture(texture1, TexCoord);\n" "}\n";

上面的语句不懂的可以查询,或者私信问我。

3 我们设置点顶点,颜色和纹理

float vertices[] = {                                                          // 位置              // 颜色             //纹理                             // positions          // colors           // texture coords           0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f, // top right     0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f, // bottom right  -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f, // bottom left  -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f  // top left     };                                                                        

这里面位置颜色是什么意思呢,举例 

                                              图1 

第一行位置: 0.5f,  0.5f, 0.0f  这是以窗口中心为0,0点,所绘制的图形在紫色位置,-x ==-1,  x ==1, -y ==-1, y==1。点在一半的位置

第一行颜色:1.0f, 0.0f, 0.0f ,意思是RGB,只显示红色。

第一行纹理:1.0f, 1.0f 是什么意思呢,看下面图说明

                                                                         图2 

图3

第一个图是位置,第二个是纹理,纹理坐标和顶点坐标大不相同,它的中心点(0,0)位于纹理图案的左下角,所以它的范围是(0-1)的,这里会取1,是因为希望得到完整的图案,取0.5也可以,最终结果的图案为原图长的一半,宽的一半。

到此我们在看图1 里面的紫色的点的纹理是什么呢?是不是就是1,1点呢??答案是的。

4 我们开始一步步写三角形

class myGlWidget : public QOpenGLWidget,public QOpenGLExtraFunctions
{
public:myGlWidget(QWidget *parent);~myGlWidget();
protected:virtual void initializeGL() override;virtual void resizeGL(int w,int h) override;virtual void paintGL() override;QVector<float> vertices;QOpenGLShaderProgram* program;QOpenGLBuffer vbo;QOpenGLVertexArrayObject vao;QOpenGLTexture* m_texture;QOpenGLTexture* m_texture2;QOpenGLBuffer m_ebo;
};
void myGlWidget::initializeGL()
{// 为当前环境初始化OpenGL函数initializeOpenGLFunctions();glClearColor(1.0f, 1.0f, 1.0f, 1.0f);    //设置背景色为白色//初始化纹理对象m_texture  = new QOpenGLTexture(QOpenGLTexture::Target2D);m_texture->setData(QImage(":/cube1.png").mirrored()); //加载砖块图片m_texture->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear,QOpenGLTexture::Nearest);//设置缩小和放大的方式,缩小图片采用LinearMipMapLinear线性过滤,并使用多级渐远纹理邻近过滤,放大图片采用:Nearest邻近过滤m_texture->setWrapMode(QOpenGLTexture::DirectionS,QOpenGLTexture::Repeat);m_texture->setWrapMode(QOpenGLTexture::DirectionT,QOpenGLTexture::Repeat);//m_texture->allocateStorage();//创建着色器程序program = new QOpenGLShaderProgram;program->addShaderFromSourceCode(QOpenGLShader::Vertex,vertexShaderSource);program->addShaderFromSourceCode(QOpenGLShader::Fragment,fragmentShaderSource);program->link();program->bind();//激活Program对象//初始化VBO,将顶点数据存储到buffer中,等待VAO激活后才能释放
//   float vertices[] = {
//           // 位置              // 颜色             //纹理
//           // positions          // colors           // texture coords
//           0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f, // top right
//           0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f, // bottom right
//           -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f, // bottom left
//           -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f  // top left
//       };float vertices[] = {//     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 --1.0f,  -1.0f, 1.0f,   1.0f, 0.0f, 0.0f,   0.0f, 1.0f,   // 右上1.0f, -1.0f, 1.0f,   0.0f, 1.0f, 0.0f,   1.0f, 1.0f,   // 右下-1.0f, 1.0f, 1.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // 左下1.0f,  1.0f, 1.0f,   1.0f, 1.0f, 0.0f,   1.0f, 0.0f    // 左上};vbo.create();vbo.bind();              //绑定到当前的OpenGL上下文,vbo.allocate(vertices, sizeof(vertices));vbo.setUsagePattern(QOpenGLBuffer::StaticDraw);  //设置为一次修改,多次使用//初始化VAO,设置顶点数据状态(顶点,法线,纹理坐标等)vao.create();vao.bind();// void setAttributeBuffer(int location, GLenum type, int offset, int tupleSize, int stride = 0);program->setAttributeBuffer(0, GL_FLOAT, 0,                  3, 8 * sizeof(float));   //设置aPos顶点属性program->setAttributeBuffer(1, GL_FLOAT, 3 * sizeof(float),  3, 8 * sizeof(float));   //设置aColor顶点颜色program->setAttributeBuffer(2, GL_FLOAT, 6 * sizeof(float),  2, 8 * sizeof(float));   //设置aColor顶点颜色//offset:第一个数据的偏移量//tupleSize:一个数据有多少个元素,比如位置为xyz,颜色为rgb,所以是3//stride:步长,下个数据距离当前数据的之间距离,比如右下位置和左下位置之间间隔了:3个xyz值+3个rgb值,所以填入 6 * sizeof(float)program->enableAttributeArray(0); //使能aPos顶点属性program->enableAttributeArray(1); //使能aColor顶点颜色program->enableAttributeArray(2); //使能顶点纹理//解绑所有对象//vao.release();//vbo.release();}
void myGlWidget::resizeGL(int w, int h)
{this->glViewport(0,0,w,h);                //定义视口区域
}
void myGlWidget::paintGL()
{this->glClearColor(0.1f,0.5f,0.7f,1.0f);  //设置清屏颜色this->glClear(GL_COLOR_BUFFER_BIT);// 渲染Shader//vao.bind();//m_texture->bind();program->setUniformValue("texture1", 0);m_texture->bind(0);  //glDrawElements(GL_TRIANGLES, 4, GL_UNSIGNED_INT, 0);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);//绘制纹理    //绘制3个定点,样式为三角形}

这样我们就绘制了一个带纹理的图形

5 那如果我们想旋转怎么做呢?

我们修改下glsl语句,这里我们增加一个矩阵

static const char *vertexShaderSource ="#version 330\n""layout (location = 0) in vec3 aPos;\n"     // 位置变量的属性位置值为0"layout (location = 1) in vec3 aColor;\n"     // 颜色变量的属性位置值为1"layout (location = 2) in vec2 aTexCoord;\n"  //纹理变量的属性位置值为2"out vec3 ourColor;\n"                     // 为片段着色器指定一个颜色输出"out vec2 TexCoord;\n"                     // 为片段着色器指定一个纹理输出"uniform mat4 transform;\n""void main(){\n""gl_Position =  transform * vec4(aPos, 1.0);\n"    //顶点信息为4个值向量   // 注意我们如何把一个vec3作为vec4的构造器的参数"ourColor = aColor;\n"        // 输出颜色变量==输入颜色"TexCoord = aTexCoord;\n"    // 输出纹理变量==输入纹理"}\n";

我们在修改响应的代码

void myGlWidget::paintGL()
{this->glClearColor(0.1f,0.5f,0.7f,1.0f);  //设置清屏颜色this->glClear(GL_COLOR_BUFFER_BIT);QMatrix4x4 matrix;matrix.setToIdentity();matrix.translate(0.4f,0.0,0.0);matrix.rotate(45,0,0,1);matrix.scale(0.5);// 渲染Shader//vao.bind();//m_texture->bind();program->setUniformValue("texture1", 0);m_texture->bind(0);program->setUniformValue("transform", matrix);//glDrawElements(GL_TRIANGLES, 4, GL_UNSIGNED_INT, 0);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);//绘制纹理    //绘制3个定点,样式为三角形}

这样我们纹理图就旋转了45°。

6 如果我们想绘制一个混合贴图需要怎么做呢?

我们继续修改glsl语句

static const char *vertexShaderSource ="#version 330\n""layout (location = 0) in vec3 aPos;\n"     // 位置变量的属性位置值为0"layout (location = 1) in vec3 aColor;\n"     // 颜色变量的属性位置值为1"layout (location = 2) in vec2 aTexCoord;\n"  //纹理变量的属性位置值为2"out vec3 ourColor;\n"                     // 为片段着色器指定一个颜色输出"out vec2 TexCoord;\n"                     // 为片段着色器指定一个纹理输出"uniform mat4 transform;\n""void main(){\n""gl_Position =  transform * vec4(aPos, 1.0);\n"    //顶点信息为4个值向量   // 注意我们如何把一个vec3作为vec4的构造器的参数"ourColor = aColor;\n"        // 输出颜色变量==输入颜色"TexCoord = aTexCoord;\n"    // 输出纹理变量==输入纹理"}\n";static const char *fragmentShaderSource ="#version 330\n""out vec4 FragColor;\n"     //输出颜色"in vec3 ourColor;\n"      //输入的颜色== vertexShaderSource(这里面的输入颜色)"in vec2 TexCoord;\n"      //输入的纹理== vertexShaderSource(这里面的输入纹理)"uniform sampler2D texture1;\n"  //得到输入的纹理"uniform sampler2D texture2;\n"  //得到输入的纹理"void main()""{\n""FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.7)* vec4(ourColor, 1.0);\n""}\n";

修改对应的代码

static const char *vertexShaderSource ="#version 330\n""layout (location = 0) in vec3 aPos;\n"     // 位置变量的属性位置值为0"layout (location = 1) in vec3 aColor;\n"     // 颜色变量的属性位置值为1"layout (location = 2) in vec2 aTexCoord;\n"  //纹理变量的属性位置值为2"out vec3 ourColor;\n"                     // 为片段着色器指定一个颜色输出"out vec2 TexCoord;\n"                     // 为片段着色器指定一个纹理输出"uniform mat4 transform;\n""void main(){\n""gl_Position =  transform * vec4(aPos, 1.0);\n"    //顶点信息为4个值向量   // 注意我们如何把一个vec3作为vec4的构造器的参数"ourColor = aColor;\n"        // 输出颜色变量==输入颜色"TexCoord = aTexCoord;\n"    // 输出纹理变量==输入纹理"}\n";static const char *fragmentShaderSource ="#version 330\n""out vec4 FragColor;\n"     //输出颜色"in vec3 ourColor;\n"      //输入的颜色== vertexShaderSource(这里面的输入颜色)"in vec2 TexCoord;\n"      //输入的纹理== vertexShaderSource(这里面的输入纹理)"uniform sampler2D texture1;\n"  //得到输入的纹理"uniform sampler2D texture2;\n"  //得到输入的纹理"void main()""{\n""FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.7)* vec4(ourColor, 1.0);\n""}\n";myGlWidget::myGlWidget(QWidget *parent):QOpenGLWidget(parent), m_ebo(QOpenGLBuffer::IndexBuffer), vbo(QOpenGLBuffer::VertexBuffer)
{}myGlWidget::~myGlWidget()
{}void myGlWidget::resizeGL(int w, int h)
{this->glViewport(0,0,w,h);                //定义视口区域
}
void myGlWidget::paintGL()
{this->glClearColor(0.1f,0.5f,0.7f,1.0f);  //设置清屏颜色this->glClear(GL_COLOR_BUFFER_BIT);QMatrix4x4 matrix;matrix.setToIdentity();matrix.translate(0.4f,0.0,0.0);matrix.rotate(45,0,0,1);matrix.scale(0.5);// 渲染Shader//vao.bind();//m_texture->bind();program->setUniformValue("texture1", 0);m_texture->bind(0);program->setUniformValue("texture2", 1);m_texture2->bind(1);program->setUniformValue("transform", matrix);//glDrawElements(GL_TRIANGLES, 4, GL_UNSIGNED_INT, 0);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);//绘制纹理    //绘制3个定点,样式为三角形}void myGlWidget::initializeGL()
{// 为当前环境初始化OpenGL函数initializeOpenGLFunctions();glClearColor(1.0f, 1.0f, 1.0f, 1.0f);    //设置背景色为白色//初始化纹理对象m_texture  = new QOpenGLTexture(QOpenGLTexture::Target2D);m_texture->setData(QImage(":/cube1.png").mirrored()); //加载砖块图片m_texture->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear,QOpenGLTexture::Nearest);//设置缩小和放大的方式,缩小图片采用LinearMipMapLinear线性过滤,并使用多级渐远纹理邻近过滤,放大图片采用:Nearest邻近过滤m_texture->setWrapMode(QOpenGLTexture::DirectionS,QOpenGLTexture::Repeat);m_texture->setWrapMode(QOpenGLTexture::DirectionT,QOpenGLTexture::Repeat);//m_texture->allocateStorage();//   //初始化纹理对象m_texture2  = new QOpenGLTexture(QOpenGLTexture::Target2D);m_texture2->setData(QImage(":/0.png").mirrored()); //返回图片的镜像,设置为Y轴反向,因为在opengl的Y坐标中,0.0对应的是图片底部m_texture2->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear,QOpenGLTexture::Nearest);//设置缩小和放大的方式,缩小图片采用LinearMipMapLinear线性过滤,并使用多级渐远纹理邻近过滤,放大图片采用:Nearest邻近过滤m_texture2->setWrapMode(QOpenGLTexture::DirectionS,QOpenGLTexture::Repeat);m_texture2->setWrapMode(QOpenGLTexture::DirectionT,QOpenGLTexture::Repeat);//m_texture2->allocateStorage();//创建着色器程序program = new QOpenGLShaderProgram;program->addShaderFromSourceCode(QOpenGLShader::Vertex,vertexShaderSource);program->addShaderFromSourceCode(QOpenGLShader::Fragment,fragmentShaderSource);program->link();program->bind();//激活Program对象//初始化VBO,将顶点数据存储到buffer中,等待VAO激活后才能释放
//   float vertices[] = {
//           // 位置              // 颜色             //纹理
//           // positions          // colors           // texture coords
//           0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f, // top right
//           0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f, // bottom right
//           -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f, // bottom left
//           -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f  // top left
//       };float vertices[] = {//     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 --1.0f,  -1.0f, 1.0f,   1.0f, 0.0f, 0.0f,   0.0f, 1.0f,   // 右上1.0f, -1.0f, 1.0f,   0.0f, 1.0f, 0.0f,   1.0f, 1.0f,   // 右下-1.0f, 1.0f, 1.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // 左下1.0f,  1.0f, 1.0f,   1.0f, 1.0f, 0.0f,   1.0f, 0.0f    // 左上};vbo.create();vbo.bind();              //绑定到当前的OpenGL上下文,vbo.allocate(vertices, sizeof(vertices));vbo.setUsagePattern(QOpenGLBuffer::StaticDraw);  //设置为一次修改,多次使用//初始化VAO,设置顶点数据状态(顶点,法线,纹理坐标等)vao.create();vao.bind();// void setAttributeBuffer(int location, GLenum type, int offset, int tupleSize, int stride = 0);program->setAttributeBuffer(0, GL_FLOAT, 0,                  3, 8 * sizeof(float));   //设置aPos顶点属性program->setAttributeBuffer(1, GL_FLOAT, 3 * sizeof(float),  3, 8 * sizeof(float));   //设置aColor顶点颜色program->setAttributeBuffer(2, GL_FLOAT, 6 * sizeof(float),  2, 8 * sizeof(float));   //设置aColor顶点颜色//offset:第一个数据的偏移量//tupleSize:一个数据有多少个元素,比如位置为xyz,颜色为rgb,所以是3//stride:步长,下个数据距离当前数据的之间距离,比如右下位置和左下位置之间间隔了:3个xyz值+3个rgb值,所以填入 6 * sizeof(float)program->enableAttributeArray(0); //使能aPos顶点属性program->enableAttributeArray(1); //使能aColor顶点颜色program->enableAttributeArray(2); //使能aColor顶点颜色//解绑所有对象//vao.release();//vbo.release();}

这样我们就可以看到两个混合的贴图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1560286.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

粗糙表面仿真和处理软件

首款基于粗糙表面的仿真和处理软件&#xff0c;该软件具有三种方法&#xff0c;主要是二维数字滤波法&#xff0c;相位频谱法和共轭梯度法。可以分别仿真具有高斯和非高斯分布的粗糙表面&#xff0c;其中非高斯表面利用Johnson转换系统进行变换给定偏度和峰度。对生成的粗糙表面…

k8s网络通信

k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel&#xff0c;calico等 CNI插件存放位置&#xff1a;# cat /etc/cni/net.d/10-flannel.conflist 插件使用的解决方案如下 虚拟网桥&#xff0c;虚拟网卡&#xff0c;多个容器共用一个虚…

YOLO11改进|注意力机制篇|引入局部注意力HaloAttention

目录 一、【HaloAttention】注意力机制1.1【HaloAttention】注意力介绍1.2【HaloAttention】核心代码 二、添加【HaloAttention】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【HaloAttention】注意力机制 1.1【HaloAttent…

同望OA tooneAssistantAttachement.jsp 任意文件读取漏洞复现

0x01 产品简介 同望OA,即同望科技打造的智企云协同管理系统,是一款高效的企业协同移动办公系统。秉承“互联网++企业管理”理念,定位于以移动互联办公为基础的企业协同管理软件平台。它旨在通过内置常用标准模块与专项管理模块应用,安全快速地打通管理与业务通道,实现管理…

科技控的双十一:精选五大热销数码产品,性价比爆表

随着每年一度的“双十一”购物狂欢节的临近&#xff0c;无数科技爱好者们已经开始摩拳擦掌&#xff0c;准备在这场年度大促中大展身手。对于热衷于追逐最新科技趋势的朋友们来说&#xff0c;“双十一”不仅仅是一场简单的购物活动&#xff0c;更是一个探索、发现并拥抱前沿科技…

私域电商新纪元:消费增值模式引领百万业绩飞跃

各位朋友&#xff0c;我是吴军&#xff0c;专注于带领大家深入探索私域电商领域的非凡魅力与潜在机会。 今天&#xff0c;我想与大家分享一个鼓舞人心的真实故事。在短短的一个月内&#xff0c;我们的合作伙伴实现了业绩的飞跃&#xff0c;突破百万大关&#xff0c;并且用户活跃…

大贤3D家谱-一键寻找家谱本源

点击“溯”&#xff0c;您可以追溯到当前节点的家谱本源。 这一功能将帮助您更深入地了解家族的历史和背景。 通过这一操作&#xff0c;系统会自动标注出与您当前节点相关的祖先信息&#xff0c;并以金色字体突出显示&#xff0c;便于您快速识别和查看。 演示如下&#xff1…

协变和逆变、事件、匿名函数

定义:协变(out)和逆变(in)是用于接口和委托中修饰泛型的,定义泛型类型的使用区域。 语法:<out T>那么T的数据类型只能用于返回值。<in T>那么T的数据类型只能用于参数列表。 //自定义委托 public delegate Result Fun<in T, in K, out Result>(…

Klick‘r3.0.4 |智能自动点击,高效省力

Klick’r 是一款专为 Android 设计的开源自动点击工具&#xff0c;能识别屏幕上的图像并进行相应操作。支持游戏中的自动点击、应用测试及日常任务自动化。 大小&#xff1a;27M 百度网盘&#xff1a;https://pan.baidu.com/s/1881Zfevph6_2Zhdc-H_R4A?pwdolxt 夸克网盘&…

shell 脚本批量更新本地git仓库

文章目录 一、问题概述二、解决方法三、运行效果1. windows2. centos 一、问题概述 你是否遇到这样的场景&#xff1a; 本地git仓库克隆了线上的多个项目&#xff0c;需要更新时&#xff0c;无法象svn一样&#xff0c;选中多个项目一起更新。 只能苦逼的一个个选中&#xff0c…

软考《信息系统运行管理员》- 4.3 信息系统软件运维的过程

4.3 信息系统软件运维的过程 文章目录 4.3 信息系统软件运维的过程日常运维日常运维的内容日常运行例行测试维护例行测试流程的关键点例行维护流程的关键点 定期测试维护 缺陷诊断与修复信息系统软件缺陷的概念信息系统软件缺陷的分类信息系统软件缺陷诊断与修复流程缺陷诊断与…

2024百度云智大会|百度大模型内容安全合规探索与实践

9月25日&#xff0c;2024百度云智大会在北京举办。会上&#xff0c;百度智能云分别针对算力、模型、AI 应用&#xff0c;全面升级百舸 AI 异构计算平台 4.0、千帆大模型平台 3.0 两大 AI 基础设施&#xff0c;并升级代码助手、智能客服、数字人三大 AI 原生应用产品。 在大模型…

App测试时常用的adb命令

adb 全称为 Android Debug Bridge&#xff08;Android 调试桥&#xff09;&#xff0c;是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#xff0c;可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

Biomamba求职| 国奖+4篇一作SCI

转眼间我也要参加秋招啦&#xff0c;认真的求职帖&#xff0c;各位老师/老板欢迎联系~其它需要求职的小伙伴也欢迎把简历发给我们&#xff0c;大家一起找工作。 一、基本信息 姓名&#xff1a;Biomamba 性别&#xff1a;男 出厂年份&#xff1a;1998 籍贯&#xff1a;浙江…

如何选择医疗器械管理系统?盘谷医疗符合最新版GSP要求

去年12月7日&#xff0c;新版《医疗器械经营质量管理规范》正式发布&#xff0c;并于今年7月1日正式实施。新版GSP第五十一条提出“经营第三类医疗器械的企业&#xff0c;应当具有符合医疗器械经营质量管理要求的计算机信息系统&#xff0c;保证经营的产品可追溯”&#xff0c;…

【笔记学习篇】一篇文章搞定Mybatis-快速回顾

概述 5.1.1 Mybatis简介 Mybatis是一款优秀的持久层框架&#xff0c;它以sql为中心&#xff0c;支持定制化sql、存储过程以及高级映射。 使用Mybatis框架&#xff0c;可以无需手动编写基础的JDBC代码、无需手动设置参数和转换结果集到对象。 Mybatis可以使用简单的xml或注解来…

xtu oj 四位数

样例输入# 2 1990 1111样例输出# 5 0 分离整数与合并 AC代码 #include<stdio.h> //判断四个数码是否相等 int Judge(int n){int flag1;int gn%10,sn/10%10,bn/100%10,qn/1000;if(gs&&gb&&gq)flag0;return flag; } int main(){int T;scanf("%d…

使用 Go 语言与 Redis 构建高效缓存与消息队列系统

什么是 Redis&#xff1f; Redis 是一个开源的内存数据库&#xff0c;支持多种数据结构&#xff0c;包括字符串、列表、集合、哈希和有序集合。由于 Redis 运行在内存中&#xff0c;读写速度极快&#xff0c;常被用于构建缓存系统、实时排行榜、会话存储和消息队列等高并发场景…

代码随想录算法训练营第四十六天 | 647. 回文子串,516.最长回文子序列

四十六天打卡&#xff0c;今天用动态规划解决回文问题&#xff0c;回文问题需要用二维dp解决 647.回文子串 题目链接 解题思路 没做出来&#xff0c;布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#xff0…

YOLO11改进|SPPF篇|引入YOLOv9提出的SPPELAN模块

目录 一、【SPPELAN】模块1.1【SPPELAN】模块介绍1.2【SPPELAN】核心代码 二、添加【SPPELAN】模块2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SPPELAN】模块 1.1【SPPELAN】模块介绍 下图是【SPPELAN】的结构图&#xff0c;让我们…