OpenGL--恒星,卫星,行星系统

2023-10-30 03:59

本文主要是介绍OpenGL--恒星,卫星,行星系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了方便,先用金字塔,正方体,小正方体代替恒星,卫星,行星。
并用矩阵堆栈的形式实现。
在这里插入图片描述

#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <string>
#include <iostream>
#include <fstream>
#include <cmath>
#include <stack>
#include <glm\glm.hpp>
#include <glm\gtc\type_ptr.hpp> // glm::value_ptr
#include <glm\gtc\matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective
#include "Utils.h"
using namespace std;#define numVAOs 1
#define numVBOs 2float cameraX, cameraY, cameraZ;//视图矩阵,相机位置
GLuint renderingProgram;
GLuint vao[numVAOs];
GLuint vbo[numVBOs];// 分配在display()函数中使用的变量空间,这样它们就不必在渲染过程中分配
GLuint mvLoc, projLoc;
int width, height;
float aspect;
glm::mat4 pMat, vMat, mMat, mvMat;stack<glm::mat4>mvStack;void setupVertices(void) {//正方体//36个顶点,12个三角形,组成了放置在原点处的2×2×2立方体float vertexPositions[108] = {-1.0f,  1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f, 1.0f,  1.0f, -1.0f, -1.0f,  1.0f, -1.0f,1.0f, -1.0f, -1.0f, 1.0f, -1.0f,  1.0f, 1.0f,  1.0f, -1.0f,1.0f, -1.0f,  1.0f, 1.0f,  1.0f,  1.0f, 1.0f,  1.0f, -1.0f,1.0f, -1.0f,  1.0f, -1.0f, -1.0f,  1.0f, 1.0f,  1.0f,  1.0f,-1.0f, -1.0f,  1.0f, -1.0f,  1.0f,  1.0f, 1.0f,  1.0f,  1.0f,-1.0f, -1.0f,  1.0f, -1.0f, -1.0f, -1.0f, -1.0f,  1.0f,  1.0f,-1.0f, -1.0f, -1.0f, -1.0f,  1.0f, -1.0f, -1.0f,  1.0f,  1.0f,-1.0f, -1.0f,  1.0f,  1.0f, -1.0f,  1.0f,  1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,  1.0f,-1.0f,  1.0f, -1.0f, 1.0f,  1.0f, -1.0f, 1.0f,  1.0f,  1.0f,1.0f,  1.0f,  1.0f, -1.0f,  1.0f,  1.0f, -1.0f,  1.0f, -1.0f};//金字塔//18个顶点,6个三角形float pyramidPositions[54] ={ -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f,    //front1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f,    //right1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f,  //back-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f,  //left-1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, //LF1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f  //RR};glGenVertexArrays(1, vao);//创建顶点数组对象VAO,      //数据集发送给管线时,是以缓冲区形式发送的glBindVertexArray(vao[0]);//将指定的VAO标记为活跃,生成的缓冲区和这个VAO关联glGenBuffers(numVBOs, vbo);//创建VBO.//参数1,创建多少个ID,参数2,保存返回的ID的数组glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);//将缓冲区【0】标记为活跃glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);//将包含顶点数据的数组复制进活跃缓冲区glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);glBufferData(GL_ARRAY_BUFFER, sizeof(pyramidPositions), pyramidPositions, GL_STATIC_DRAW);
}//init()函数负责执行只需要一次的任务
void init(GLFWwindow* window) {renderingProgram = Utils::createShaderProgram("vertShader.glsl", "fragShader.glsl");//获取GL程序的ID,该程序创建着色器glfwGetFramebufferSize(window, &width, &height);aspect = (float)width / (float)height;//屏幕纵横比.透视矩阵需要的参数//构建透视矩阵//根据所需的视锥提供3D效果,这里放在了init里,因为只需要构建一次pMat = glm::perspective(1.0472f, aspect, 0.1f, 1000.0f);//构建透视矩阵//参数 1. 指定视场角(这里是60°,对应弧度是1.0472)//,2. 屏幕纵横比 ,3.近裁剪平面,4.远裁剪平面cameraX = 0.0f; cameraY = 0.0f; cameraZ = 12.0f;//相机放在z轴的下方setupVertices();//将顶点数据复制进缓冲区
}//调用display函数的速率被称为帧率
void display(GLFWwindow* window, double currentTime) {
//配置背景,深度缓冲区,渲染程序,以及和原来一样的投影矩阵/////清除深度缓冲区glClear(GL_DEPTH_BUFFER_BIT);//隐藏面消除需要同时用到颜色缓冲区和深度缓冲区glClearColor(1.0, 1.0, 1.0, 1.0);						//这里只清楚了深度缓冲区,不然可能会导致黑屏glClear(GL_COLOR_BUFFER_BIT);glEnable(GL_CULL_FACE);//背面剔除//启用着色器glUseProgram(renderingProgram);//将含有两个已编译着色器的程序载入OpenGL管线阶段(在GPU上!)//glUseProgram没有运行着色器,它只是将着色器加载进硬件//着色器需要视图矩阵的统一变量//获取V矩阵和投影矩阵的统一变量// m/模型矩阵在世界坐标空间中表示对象的位置和朝向mvLoc = glGetUniformLocation(renderingProgram, "mv_matrix");//获取着色器程序中MV矩阵统一变量的位置projLoc = glGetUniformLocation(renderingProgram, "proj_matrix");//获取着色器程序中投影矩阵统一变量的位置
//将视图矩阵推入堆栈vMat = glm::translate(glm::mat4(1.0f), glm::vec3(-cameraX, -cameraY, -cameraZ));//v,视图,相机,变换矩阵mvStack.push(vMat);//摄像机glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(pMat));//将矩阵数据发送到统一变量中//--------------------pyramid == sunmvStack.push(mvStack.top());//将新矩阵推入堆栈,对第一个对象来说,直接复制一份视图矩阵mvStack.top() *= glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -0.0f));//太阳的位置//将父对象的模型矩阵和复制的的视图矩阵结合mvStack.push(mvStack.top());//生成完整的MV矩阵,包括它的自转mvStack.top() *= rotate(glm::mat4(1.0f), (float)currentTime, glm::vec3(1.0f, 0.0f, 0.0f));//稍后会弹出不会影响子对象glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvStack.top()));//将矩阵数据发送到统一变量中,value_ptr返回的是对矩阵数据的引用glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);//将VBO关联给顶点着色器中相应的顶点属性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);glEnable(GL_DEPTH_TEST);	//调整OpenGL设置,绘制模型glDepthFunc(GL_LEQUAL);glFrontFace(GL_CW);glDrawArrays(GL_TRIANGLES, 0, 18);mvStack.pop();//---------------------cube == planetmvStack.push(mvStack.top());mvStack.top() *= glm::translate(glm::mat4(1.0f), glm::vec3(sin((float)currentTime) * 4.0, 0.0f, cos((float)currentTime) * 4.0));mvStack.push(mvStack.top());mvStack.top() *= rotate(glm::mat4(1.0f), (float)currentTime, glm::vec3(0.0, 1.0, 0.0));//稍后会弹出不会影响子对象glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvStack.top()));//将矩阵数据发送到统一变量中,value_ptr返回的是对矩阵数据的引用glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);//将VBO关联给顶点着色器中相应的顶点属性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);glEnable(GL_DEPTH_TEST);	//调整OpenGL设置,绘制模型glDepthFunc(GL_LEQUAL);glDrawArrays(GL_TRIANGLES, 0, 36);mvStack.pop();//-----------------------smaller cube == moonmvStack.push(mvStack.top());mvStack.top() *= glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, sin((float)currentTime) * 2.0, cos((float)currentTime) * 2.0));mvStack.top() *= rotate(glm::mat4(1.0f), (float)currentTime, glm::vec3(0.0, 0.0, 1.0));mvStack.top() *= scale(glm::mat4(1.0f), glm::vec3(0.25, 0.25, 0.25));glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvStack.top()));//将矩阵数据发送到统一变量中,value_ptr返回的是对矩阵数据的引用glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);//将VBO关联给顶点着色器中相应的顶点属性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);glEnable(GL_DEPTH_TEST);	//调整OpenGL设置,绘制模型glDepthFunc(GL_LEQUAL);glDrawArrays(GL_TRIANGLES, 0, 36);mvStack.pop(); mvStack.pop(); mvStack.pop();mvStack.pop();//最后一个是视图矩阵
}
void window_size_callback(GLFWwindow* win, int newWidth, int newHeight) {aspect = (float)newWidth / (float)newHeight;glViewport(0, 0, newWidth, newHeight);pMat = glm::perspective(1.0472f, aspect, 0.1f, 1000.0f);
}
int main(void) {if (!glfwInit()) { exit(EXIT_FAILURE); }glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);//设置窗口选项glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);GLFWwindow* window = glfwCreateWindow(600, 600, "Chapter 4 - program 2", NULL, NULL);glfwMakeContextCurrent(window);//让当前窗口的环境在当前线程上成为当前环境if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }glfwSwapInterval(1);glfwSetWindowSizeCallback(window, window_size_callback);init(window);while (!glfwWindowShouldClose(window)) {display(window, glfwGetTime());glfwSwapBuffers(window);glfwPollEvents();}glfwDestroyWindow(window);glfwTerminate();exit(EXIT_SUCCESS);
}
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <SOIL2\soil2.h>
#include <string>
#include <iostream>
#include <fstream>
#include <cmath>
#include <glm\glm.hpp>
#include <glm\gtc\type_ptr.hpp> // glm::value_ptr
#include <glm\gtc\matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective
#include "Utils.h"
using namespace std;Utils::Utils() {}string Utils::readShaderFile(const char *filePath) {string content;ifstream fileStream(filePath, ios::in);string line = " ";while (!fileStream.eof()) {getline(fileStream, line);content.append(line + "\n");}fileStream.close();return content;
}bool Utils::checkOpenGLError() {bool foundError = false;int glErr = glGetError();while (glErr != GL_NO_ERROR) {cout << "glError: " << glErr << endl;foundError = true;glErr = glGetError();}return foundError;
}void Utils::printShaderLog(GLuint shader) {int len = 0;int chWrittn = 0;char *log;glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);if (len > 0) {log = (char *)malloc(len);glGetShaderInfoLog(shader, len, &chWrittn, log);cout << "Shader Info Log: " << log << endl;free(log);}
}GLuint Utils::prepareShader(int shaderTYPE, const char *shaderPath)
{	GLint shaderCompiled;string shaderStr = readShaderFile(shaderPath);const char *shaderSrc = shaderStr.c_str();//获取着色器信息的字符串GLuint shaderRef = glCreateShader(shaderTYPE);//创建着色器glShaderSource(shaderRef, 1, &shaderSrc, NULL);//将字符串复制进着色器中glCompileShader(shaderRef);//编译着色器checkOpenGLError();glGetShaderiv(shaderRef, GL_COMPILE_STATUS, &shaderCompiled);if (shaderCompiled != 1){	if (shaderTYPE == 35633) cout << "Vertex ";if (shaderTYPE == 36488) cout << "Tess Control ";if (shaderTYPE == 36487) cout << "Tess Eval ";if (shaderTYPE == 36313) cout << "Geometry ";if (shaderTYPE == 35632) cout << "Fragment ";cout << "shader compilation error." << endl;printShaderLog(shaderRef);}return shaderRef;//返回程序的ID
}void Utils::printProgramLog(int prog) {int len = 0;int chWrittn = 0;char *log;glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len);if (len > 0) {log = (char *)malloc(len);glGetProgramInfoLog(prog, len, &chWrittn, log);cout << "Program Info Log: " << log << endl;free(log);}
}int Utils::finalizeShaderProgram(GLuint sprogram)
{	GLint linked;glLinkProgram(sprogram); //请求GLSL编译器确保他们的兼容性checkOpenGLError();glGetProgramiv(sprogram, GL_LINK_STATUS, &linked);if (linked != 1){	cout << "linking failed" << endl;printProgramLog(sprogram);}return sprogram;
}GLuint Utils::createShaderProgram(const char *vp, const char *fp) {GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp);//获取编译着色器后得到的着色器对象GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp);GLuint vfprogram = glCreateProgram();//创建程序对象glAttachShader(vfprogram, vShader);//将着色器对象载入程序对象中glAttachShader(vfprogram, fShader);finalizeShaderProgram(vfprogram); //请求GLSL编译器确保他们的兼容性return vfprogram;
}GLuint Utils::createShaderProgram(const char *vp, const char *gp, const char *fp) {GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp);GLuint gShader = prepareShader(GL_GEOMETRY_SHADER, gp);GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp);GLuint vgfprogram = glCreateProgram();glAttachShader(vgfprogram, vShader);glAttachShader(vgfprogram, gShader);glAttachShader(vgfprogram, fShader);finalizeShaderProgram(vgfprogram);return vgfprogram;
}GLuint Utils::createShaderProgram(const char *vp, const char *tCS, const char* tES, const char *fp) {GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp);GLuint tcShader = prepareShader(GL_TESS_CONTROL_SHADER, tCS);GLuint teShader = prepareShader(GL_TESS_EVALUATION_SHADER, tES);GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp);GLuint vtfprogram = glCreateProgram();glAttachShader(vtfprogram, vShader);glAttachShader(vtfprogram, tcShader);glAttachShader(vtfprogram, teShader);glAttachShader(vtfprogram, fShader);finalizeShaderProgram(vtfprogram);return vtfprogram;
}GLuint Utils::createShaderProgram(const char *vp, const char *tCS, const char* tES, char *gp, const char *fp) {GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp);GLuint tcShader = prepareShader(GL_TESS_CONTROL_SHADER, tCS);GLuint teShader = prepareShader(GL_TESS_EVALUATION_SHADER, tES);GLuint gShader = prepareShader(GL_GEOMETRY_SHADER, gp);GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp);GLuint vtgfprogram = glCreateProgram();glAttachShader(vtgfprogram, vShader);glAttachShader(vtgfprogram, tcShader);glAttachShader(vtgfprogram, teShader);glAttachShader(vtgfprogram, gShader);glAttachShader(vtgfprogram, fShader);finalizeShaderProgram(vtgfprogram);return vtgfprogram;
}GLuint Utils::loadCubeMap(const char *mapDir) {GLuint textureRef;string xp = mapDir; xp = xp + "/xp.jpg";string xn = mapDir; xn = xn + "/xn.jpg";string yp = mapDir; yp = yp + "/yp.jpg";string yn = mapDir; yn = yn + "/yn.jpg";string zp = mapDir; zp = zp + "/zp.jpg";string zn = mapDir; zn = zn + "/zn.jpg";textureRef = SOIL_load_OGL_cubemap(xp.c_str(), xn.c_str(), yp.c_str(), yn.c_str(), zp.c_str(), zn.c_str(),SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);if (textureRef == 0) cout << "didnt find cube map image file" << endl;//	glBindTexture(GL_TEXTURE_CUBE_MAP, textureRef);// reduce seams//	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);//	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);//	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);return textureRef;
}GLuint Utils::loadTexture(const char *texImagePath)
{	GLuint textureRef;textureRef = SOIL_load_OGL_texture(texImagePath, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);if (textureRef == 0) cout << "didnt find texture file " << texImagePath << endl;// ----- mipmap/anisotropic sectionglBindTexture(GL_TEXTURE_2D, textureRef);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);glGenerateMipmap(GL_TEXTURE_2D);if (glewIsSupported("GL_EXT_texture_filter_anisotropic")) {GLfloat anisoset = 0.0f;glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisoset);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoset);}// ----- end of mipmap/anisotropic sectionreturn textureRef;
}// GOLD material - ambient, diffuse, specular, and shininess
float* Utils::goldAmbient() { static float a[4] = { 0.2473f, 0.1995f, 0.0745f, 1 }; return (float*)a; }
float* Utils::goldDiffuse() { static float a[4] = { 0.7516f, 0.6065f, 0.2265f, 1 }; return (float*)a; }
float* Utils::goldSpecular() { static float a[4] = { 0.6283f, 0.5559f, 0.3661f, 1 }; return (float*)a; }
float Utils::goldShininess() { return 51.2f; }// SILVER material - ambient, diffuse, specular, and shininess
float* Utils::silverAmbient() { static float a[4] = { 0.1923f, 0.1923f, 0.1923f, 1 }; return (float*)a; }
float* Utils::silverDiffuse() { static float a[4] = { 0.5075f, 0.5075f, 0.5075f, 1 }; return (float*)a; }
float* Utils::silverSpecular() { static float a[4] = { 0.5083f, 0.5083f, 0.5083f, 1 }; return (float*)a; }
float Utils::silverShininess() { return 51.2f; }// BRONZE material - ambient, diffuse, specular, and shininess
float* Utils::bronzeAmbient() { static float a[4] = { 0.2125f, 0.1275f, 0.0540f, 1 }; return (float*)a; }
float* Utils::bronzeDiffuse() { static float a[4] = { 0.7140f, 0.4284f, 0.1814f, 1 }; return (float*)a; }
float* Utils::bronzeSpecular() { static float a[4] = { 0.3936f, 0.2719f, 0.1667f, 1 }; return (float*)a; }
float Utils::bronzeShininess() { return 25.6f; }
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <SOIL2\soil2.h>
#include <string>
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <glm\glm.hpp>
#include <glm\gtc\type_ptr.hpp>
#include <glm\gtc\matrix_transform.hpp>class Utils
{
private:static std::string readShaderFile(const char *filePath);static void printShaderLog(GLuint shader);static void printProgramLog(int prog);static GLuint prepareShader(int shaderTYPE, const char *shaderPath);static int finalizeShaderProgram(GLuint sprogram);public:Utils();static bool checkOpenGLError();static GLuint createShaderProgram(const char *vp, const char *fp);static GLuint createShaderProgram(const char *vp, const char *gp, const char *fp);static GLuint createShaderProgram(const char *vp, const char *tCS, const char* tES, const char *fp);static GLuint createShaderProgram(const char *vp, const char *tCS, const char* tES, char *gp, const char *fp);static GLuint loadTexture(const char *texImagePath);static GLuint loadCubeMap(const char *mapDir);static float* goldAmbient();static float* goldDiffuse();static float* goldSpecular();static float goldShininess();static float* silverAmbient();static float* silverDiffuse();static float* silverSpecular();static float silverShininess();static float* bronzeAmbient();static float* bronzeDiffuse();static float* bronzeSpecular();static float bronzeShininess();
};

vertShader.glsl

#version 430layout (location=0) in vec3 position;uniform mat4 mv_matrix;
uniform mat4 proj_matrix;out vec4 varyingColor;void main(void)
{gl_Position = proj_matrix * mv_matrix * vec4(position,1.0);varyingColor = vec4(position,1.0)*0.5 + vec4(0.5, 0.5, 0.5, 0.5);
} 

fragShader.glsl

#version 430in vec4 varyingColor;
out vec4 color;uniform mat4 mv_matrix;
uniform mat4 proj_matrix;void main(void)
{	color = varyingColor;
}

这篇关于OpenGL--恒星,卫星,行星系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305461

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景