当前位置: 首页 > article >正文

OpenGL ES 基本基本使用、绘制基本2D图形

OpenGL ES 绘制基础图形

OpenGL ES基本概念

OpenGL ES (Embedded-System) 是专为嵌入式设备(如手机、平板、VR 设备)设计的图形 API,是 OpenGL 的轻量级版本。

|下面是一个Android使用 OpenGL ES的基本框架

  • MainActivity 设置一个 GLSurfaceView 直接显示

class MainActivity : ComponentActivity() {private lateinit var glSurfaceView: GLSurfaceViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)glSurfaceView = GLSurfaceView(this)// 设置渲染器glSurfaceView.setRenderer(GLRender())setContentView(glSurfaceView)}override fun onResume() {super.onResume()glSurfaceView.onResume()}override fun onPause() {super.onPause()glSurfaceView.onPause()}
}
  • GLRender 着色器代码已经其内部函数含义,由于没有绘制样式,运行后显示黑色屏幕,因为onSurfaceCreated时将颜色重制为黑色。

class GLRender : Renderer {/*** 应用程序窗口创建时调用的函数* 一般处理一些全局的设置*/override fun onSurfaceCreated(gl: GL10, config: EGLConfig?) {// 设置需要对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST)// 设置清理屏幕颜色 RGBA 取值范围为 0-1之间的float数 0 0 0 就是黑色gl.glClearColor(0F, 0F, 0F, 1F)// 启动深度缓存 如果不启动深度缓存效果,后绘制的东西可能会覆盖先绘制的东西。// 启动深度缓存后,按照实际Z值来处理远近效果,更符合3D效果。gl.glEnable(GL10.GL_DEPTH_TEST)}/*** 应用程序窗口改变时调用的函数*/override fun onSurfaceChanged(gl: GL10, width: Int, height: Int) {val ratio: Float = width / height.toFloat()// 设置GL场景的大小gl.glViewport(0, 0, width, height)// 设置投影矩阵为投影矩阵// 定义视锥体(View Frustum)和投影方式(透视或正交),决定物体如何从 3D 空间投影到 2D 屏幕上。// 其他矩阵类型还有模型矩阵,纹理矩阵等gl.glMatrixMode(GL10.GL_PROJECTION)// 重制投影矩阵// 作用是将当前矩阵重置为单位矩阵(Identity Matrix)。// 若不调用该函数,矩阵会保留之前的变换状态,可能导致后续变换叠加在已有变换上,产生非预期的结果gl.glLoadIdentity()// 创建一个透视投影矩阵,设置窗口大小gl.glFrustumf(-ratio, ratio, -1F, 1F, 1F, 10F)}/*** Android在图形绘制时调用的方法,除非设置手动刷新,否则会一直调用。*/override fun onDrawFrame(gl: GL10) {// 清理缓存 颜色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 设置模型视图矩阵gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩阵gl.glLoadIdentity()// 视角变换,就是观察的方向,眼睛的位置,中心点的位置 和 视线的朝向GLU.gluLookAt(gl,0F,0F,3F,0F,0F,0F,0F,1F,0F)}
}

通过 OpenGL ES 完成 2D图形的绘制。

  • OpenGL的坐标向线如下:
    openGL 坐标

绘制三角形

private val one: Int = 0x10000// 正确创建直接缓冲区private val triggerBuffer: IntBuffer by lazy {// 创建直接缓冲区并设置本地字节序val byteBuffer = ByteBuffer.allocateDirect(3 * 3 * 4) // 3个顶点,每个3个分量,每个int占4字节byteBuffer.order(ByteOrder.nativeOrder())// 获取 IntBuffer 视图val intBuffer = byteBuffer.asIntBuffer()// 填充顶点数据intBuffer.put(intArrayOf(0, one, 0,        // 顶点1-one, -one, 0,    // 顶点2one, -one, 0      // 顶点3))// 重置位置到起始点intBuffer.position(0)intBuffer}
override fun onDrawFrame(gl: GL10) {// 清理缓存 颜色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 设置模型视图矩阵gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩阵gl.glLoadIdentity()// 视角变换,就是观察的方向,眼睛的位置,中心点的位置 和 视线的朝向GLU.gluLookAt(gl, 0F, 0F, 3F, 0F, 0F, 0F, 0F, 1F, 0F)// 允许设置顶点gl.glEnableClientState(GL10.GL_VERTEX_ARRAY)// 给三角形设置顶点数组// size 含义代表每个点有 xyz三个方向数据所以size为3;// GL10.GL_FIXED 为整形数据 还可以设置 GL_FLOAT 浮点型,以及其他类型,甚至是无符号类型// 第三个参数代表相邻顶点之间的偏移量,0 表示紧密排列。即下一个顶点数据紧跟当前顶点数据。非0的话代表交替存储顶点数据额外便宜的字节。gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer)// 绘制三角形 GL_TRIANGLES 代表三角形,开始0 绘制3个点。gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3)// 关闭顶点设置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY)}

上述代码绘制了一个三角形如下:
在这里插入图片描述

需要注意的是创建三角形顶点使用的buffer必须使用直接缓冲区,提高数据读取的速度。

  • 绘制正方形 , 三角形右侧增加绘制正方形。
// 创建正方形直接缓冲区private val squareBuffer: IntBuffer by lazy {// 创建直接缓冲区并设置本地字节序val byteBuffer = ByteBuffer.allocateDirect(4 * 3 * 4) // 4个顶点,每个3个分量,每个int占4字节byteBuffer.order(ByteOrder.nativeOrder())// 获取 IntBuffer 视图val intBuffer = byteBuffer.asIntBuffer()// 填充顶点数据intBuffer.put(intArrayOf(one, one, 0,        // 顶点1-one, one, 0,    // 顶点2one, -one, 0,      // 顶点3-one, -one, 0      // 顶点4))// 重置位置到起始点intBuffer.position(0)intBuffer}/*** Android在图形绘制时调用的方法,除非设置手动刷新,否则会一直调用。*/override fun onDrawFrame(gl: GL10) {// 清理缓存 颜色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 设置模型视图矩阵gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩阵gl.glLoadIdentity()// 视角变换,就是观察的方向,眼睛的位置,中心点的位置 和 视线的朝向GLU.gluLookAt(gl, 0F, 0F, 3F, 0F, 0F, 0F, 0F, 1F, 0F)// 设置模型位置gl.glTranslatef(-2.0F, 0.0F, -4.0F)// 允许设置顶点gl.glEnableClientState(GL10.GL_VERTEX_ARRAY)// 给三角形设置顶点数组// size 含义代表每个点有 xyz三个方向数据所以size为3;// GL10.GL_FIXED 为整形数据 还可以设置 GL_FLOAT 浮点型,以及其他类型,甚至是无符号类型// 第三个参数代表相邻顶点之间的偏移量,0 表示紧密排列。即下一个顶点数据紧跟当前顶点数据。非0的话代表交替存储顶点数据额外便宜的字节。gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer)// 绘制三角形 GL_TRIANGLES 代表三角形,开始0 绘制3个点。gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3)// 重制模型矩阵gl.glLoadIdentity()// 绘制正方形  两个相同的三角形组成正方形,可以采用三角形的带// 设置模型位置  为了显示效果更小所以 Z 周弄远了。Z越大看起来离我们越近显示效果越大(也可以通过坐标修改)gl.glTranslatef(1F, 0.0F, -6.0F)// 设置顶点数据gl.glVertexPointer(3, GL10.GL_FIXED, 0, squareBuffer)// 绘制正方形gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4)// 关闭顶点设置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY)}

绘制三角形以后,重制模型矩阵gl.glLoadIdentity() ,设置模型位置 gl.glTranslatef,设置顶点数据gl.glVertexPointer,绘制正方形。gl.glDrawArrays。

效果如下
在这里插入图片描述

在0penGL中绘制2D多边形常用的函数以及常量:

  • glEnableClientState/glDisableClientState:状态开关
  • glVertexPointer:设置顶点数据
  • glDrawArrays:绘制函数
  • GL_VERTEX_ARRAY:顶点数组
  • GL_BYTE/GL_SHORT/GL_FIXED/GL_FLOAT:顶点数据的类理
  • GL_LINES:线
  • GL_TRIANGLES:三角形
  • GL_TRIANGLE_STRIP:三角形带

如何绘制颜色

// 创建颜色buffer 分为 RGBA private val colorBuffer: IntBuffer by lazy {// 创建直接缓冲区并设置本地字节序val byteBuffer = ByteBuffer.allocateDirect(3 * 4 * 4)byteBuffer.order(ByteOrder.nativeOrder())// 获取 IntBuffer 视图val intBuffer = byteBuffer.asIntBuffer()// 填充顶点数据intBuffer.put(intArrayOf(one, 0, 0, one,         // 顶点10, one, 0, one,   // 顶点20, 0, one, one      // 顶点3))// 重置位置到起始点intBuffer.position(0)intBuffer}override fun onDrawFrame(gl: GL10) {// 清理缓存 颜色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 设置模型视图矩阵gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩阵gl.glLoadIdentity()// 视角变换,就是观察的方向,眼睛的位置,中心点的位置 和 视线的朝向GLU.gluLookAt(gl, 0F, 0F, 3F, 0F, 0F, 0F, 0F, 1F, 0F)// 设置模型位置gl.glTranslatef(-2.0F, 0.0F, -4.0F)// 允许设置顶点gl.glEnableClientState(GL10.GL_VERTEX_ARRAY)// 允许设置颜色数组gl.glEnableClientState(GL10.GL_COLOR_ARRAY)gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer)// 给三角形设置顶点数组// size 含义代表每个点有 xyz三个方向数据所以size为3;// GL10.GL_FIXED 为整形数据 还可以设置 GL_FLOAT 浮点型,以及其他类型,甚至是无符号类型// 第三个参数代表相邻顶点之间的偏移量,0 表示紧密排列。即下一个顶点数据紧跟当前顶点数据。非0的话代表交替存储顶点数据额外便宜的字节。gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer)// 绘制三角形 GL_TRIANGLES 代表三角形,开始0 绘制3个点。gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3)// 绘制完成禁用颜色数组绘制gl.glDisableClientState(GL10.GL_COLOR_ARRAY)// 重制模型矩阵gl.glLoadIdentity()// 绘制正方形  两个相同的三角形组成正方形,可以采用三角形的带// 设置模型位置  为了显示效果更小所以 Z 周弄远了。Z越大看起来离我们越近显示效果越大gl.glTranslatef(1F, 0.0F, -6.0F)// 设置顶点数据gl.glVertexPointer(3, GL10.GL_FIXED, 0, squareBuffer)// 设置颜色,R G B A 的色值gl.glColor4f(1F, 0F, 0F, 1F)// 绘制正方形gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4)// 关闭顶点设置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY)}

// 设置颜色,R G B A 的色值
gl.glColor4f(1F, 0F, 0F, 1F) 这里只给红色和透明度设置成1 显示效果为红色
给正方形上色,直接采用设置RGBA的方式,单一的颜色

gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer) 给三角形绘制平滑过渡的颜色,需要开启设置颜色数组,使用结束后关闭。

效果如下:
在这里插入图片描述

  • 颜色所需要的常用函数
常用函数及常量
- glColor4f:设置单一颜色
- glColorPointer:设置颜色数组
- GL_COLOR_ARRAY:颜色数组(通过状态开关函数
- glDisableClientState 来操作)
- GL_COLOR_BUFFER_BIT:颜色缓存

图形的变换

OpenGLES有三种不同类型的变换,它们分别是:转移(Translate):在3D空间中移动物体旋转(Rotate):绕X,Y,或者 Z 轴进行旋转缩放(Scale):改变物体的大小
  • 为了防止上述三角形和正方形的位置重叠,进行了 gl.glTranslatef(1F, 0.0F, -6.0F) 这就是平移操作。

gl.glTranslatef(1F, 0.0F, -6.0F) 代表分别在 x y z上分别平移多少距离。

  • 旋转操作
 /*** 定义旋转角度*/var rotate1: Float = 0Fvar rotate2: Float = 0F/*** Android在图形绘制时调用的方法,除非设置手动刷新,否则会一直调用。*/override fun onDrawFrame(gl: GL10) {// 清理缓存 颜色和深度gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)// 设置模型视图矩阵gl.glMatrixMode(GL10.GL_MODELVIEW)// 重制矩阵gl.glLoadIdentity()// 视角变换,就是观察的方向,眼睛的位置,中心点的位置 和 视线的朝向GLU.gluLookAt(gl, 0F, 0F, 3F, 0F, 0F, 0F, 0F, 1F, 0F)// 设置模型位置gl.glTranslatef(-2.0F, 0.0F, -4.0F)// 设置旋转角度 设置成了绕Y轴旋转gl.glRotatef(rotate1, 0F, 1F, 0F)// 允许设置顶点gl.glEnableClientState(GL10.GL_VERTEX_ARRAY)// 允许设置颜色数组gl.glEnableClientState(GL10.GL_COLOR_ARRAY)gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer)// 给三角形设置顶点数组// size 含义代表每个点有 xyz三个方向数据所以size为3;// GL10.GL_FIXED 为整形数据 还可以设置 GL_FLOAT 浮点型,以及其他类型,甚至是无符号类型// 第三个参数代表相邻顶点之间的偏移量,0 表示紧密排列。即下一个顶点数据紧跟当前顶点数据。非0的话代表交替存储顶点数据额外便宜的字节。gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer)// 绘制三角形 GL_TRIANGLES 代表三角形,开始0 绘制3个点。gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3)// 绘制完成禁用颜色数组绘制gl.glDisableClientState(GL10.GL_COLOR_ARRAY)// 重制模型矩阵gl.glLoadIdentity()// 绘制正方形  两个相同的三角形组成正方形,可以采用三角形的带// 设置模型位置  为了显示效果更小所以 Z 周弄远了。Z越大看起来离我们越近显示效果越大gl.glTranslatef(1F, 0.0F, -6.0F)// 设置绕X轴旋转gl.glRotatef(rotate2, 1F, 0F, 0F)// 设置顶点数据gl.glVertexPointer(3, GL10.GL_FIXED, 0, squareBuffer)// 设置颜色,R G B A 的色值gl.glColor4f(1F, 0F, 0F, 1F)// 绘制正方形gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4)// 关闭顶点设置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY)// 改变旋转角度rotate1 += 0.5Frotate2 += 0.5F}

在这里插入图片描述

上端代码实际上增加了 gl.glRotatef(rotate2, 1F, 0F, 0F) ,参数依次是 角度,x轴 y轴 z轴旋转。看上图效果实际上是动旋转,三角Y轴旋转,正方形一直绕x轴旋转。然后通过改变第一个参数的角度,一直旋转。

  • 放大
// 增加如下代码即可 x y z 放大2倍 
gl.glScalef(2.0F,2.0F,2.0F)

在这里插入图片描述

总结

2D基本图形的绘制;坐标系;着色方式包括单一着色,平滑着色;图形的平移、旋转、缩放。

相关文章:

OpenGL ES 基本基本使用、绘制基本2D图形

OpenGL ES 绘制基础图形 OpenGL ES基本概念 OpenGL ES (Embedded-System) 是专为嵌入式设备(如手机、平板、VR 设备)设计的图形 API,是 OpenGL 的轻量级版本。 |下面是一个Android使用 OpenGL ES的基本框架 MainActivity 设置一…...

spark调度系统核心组件SparkContext、DAGSchedul、TaskScheduler、Taskset介绍

目录 1. SparkContext2.DAGScheduler3. TaskScheduler4. 协作关系5 TaskSet的定义6. 组件关系说明Spark调度系统的核心组件主要有SparkContext、DAGScheduler和TaskScheduler SparkContext介绍 1. SparkContext 1、资源申请: SparkContext是Spark应用程序与集群管理器(如St…...

BU9792驱动段式LCD

1、C文件,需要自己添加软件iic或硬件iic驱动,该驱动在我的别的文章内有。亲测bu9792是正常驱动的(只用到了前14个SEG),说实话有点懵了。后面的ICSET有个P2根据不同的SEG地址要置1或0,读的时候最高位也是0?读命令寄存器…...

Springboot通过SSE实现实时消息返回

Server-Sent Events(SSE)是一种从服务器向客户端推送实时消息的技术。相较于WebSocket,SSE更为简单,适用于大多数实时消息场景。本文将深入探讨如何使用Spring Boot通过SSE实现实时消息返回。 一、什么是SSE SSE是一种允许服务器…...

SD-WAN技术详解:如何优化网络性能与QoS实现?(附QoS策略、链路聚合、网络架构对比)

随着企业数字化转型的快速推进,传统WAN架构逐渐难以满足企业在性能、成本和服务质量(QoS)方面的要求。尤其是企业关键业务应用(例如语音通话、高清视频会议、企业核心业务系统)对网络性能的要求越来越高。SD-WAN&#…...

力扣-将x减到0的最小操作数

1.题目描述 2.题目链接 1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode) 3.题目分析 1)正面求解困难 题目要求我们每次都从最左边或者最右边取一个数,使x-元素的值,并在数组中移除该元素。最后返回的最小操作数…...

Web前端开发: 什么是JavaScript?

什么是JavaScript? JavaScript 是一种广泛应用于网页开发的脚本语言,主要用于为网站添加交互性和动态功能。 1. 核心作用 前端开发:控制网页行为,例如点击按钮弹出提示、表单验证、动态加载内容等。 后端开发:通过 No…...

三、【数据建模篇】:用 Django Models 构建测试平台核心数据

【数据建模篇】:用 Django Models 构建测试平台核心数据 前言我们要设计哪些核心数据?准备工作:创建 Django App开始设计数据模型 (Models)1. 通用基础模型 (可选但推荐)2. 项目模型 (Project)3. 模块模型 (Module)4. 测试用例模型 (TestCase…...

【JAVA】比较器Comparator与自然排序(28)

JAVA 核心知识点详细解释 Java中比较器Comparator的概念和使用方法 概念 Comparator 是 Java 中的一个函数式接口,位于 java.util 包下。它用于定义对象之间的比较规则,允许我们根据自定义的逻辑对对象进行排序。与对象的自然排序(实现 Comparable 接口)不同,Comparat…...

shp2pgsql 导入 Shp 到 PostGIS 空间数据库

前言 ❝ shp2pgsql是PostGIS自带的命令行工具,用于将Shapefile文件声称SQL脚本导入到PostGIS空间数据库。 1. 安装 PostGIS 通过Application Stack Builder或者下载单独的PostGIS包进行安装。而shp2pgsql则是与PostGIS工具集成在一起,无需单独下载。该命…...

word设置如“第xx页 共xx页”格式的页码

问题1: 为word文档设置如“第xx页 共xx页”格式的页码。 解决方法: 1、鼠标双击页脚位置进入页脚编辑模式; 2、在页脚处输入“第 页 共 页”内容并居中; 3、将光标放在“第 页”之间并插入“Page”,执行操作“…...

DL00912-基于自监督深度聚类的高光谱目标检测含数据集

在科研的道路上,数据的获取与分析无疑是成功的关键。对于从事高光谱数据研究的你,我们为您带来了一款革命性的工具——基于自监督深度聚类的高光谱目标检测系统。 完整代码数据集见文末 这款系统通过最先进的自监督学习技术,结合深度聚类算…...

PostgreSQL架构

目录 一、PostgreSQL核心特性与优势 1.PostgreSQL简介 2.PostgreSQL的核心特点 (1)开源与自由 (2)高度符合SQL标准 (3)丰富的数据类型 (4)事务与并发控制 (5&…...

文章记单词 | 第111篇(六级)

一,单词释义 damage /ˈdmɪdʒ/ v./n. 损害;损坏;损失harbour /ˈhɑːbə(r)/ n. 港口;港湾 v. 庇护;窝藏(美式拼写:harbor)gasp /ɡsp/ v. 喘气;喘息 n. 喘息&#x…...

在Java中,将Object对象转换为具体实体类对象

在Java中,将Object对象转换为具体实体类对象可以通过以下几种方法实现: 1‌.使用instanceof关键字进行类型检查和转换‌: 首先,使用instanceof关键字检查Object对象是否为目标实体类的类型。 如果是,则进行强制类型…...

Runtipi - 开源个人家庭服务器管理工具

项目功能:家庭服务器管理 ▎项目介绍: 一个开源的个人家庭服务器管理工具,旨在简化在单一服务器上管理和运行多个服务的过程。 它基于 Docker 构建,提供了一个简单的 Web 界面,用户可以通过该界面轻松添加和管理服务…...

Vue3和React中插件化设计思想

Vue 3 和 React 都广泛支持插件化设计思想,但因为它们的架构和理念不同,插件化的实现方式也不尽相同。以下分别详细讲解这两者中如何实现插件化: 🟩 一、Vue 3 中的插件化实现 Vue 3 继承了 Vue 2 的插件机制,同时增强…...

基于ResNet的医学影像辅助诊断系统

源码下载地址: https://download.csdn.net/download/shangjg03/90873910 1. 简介 医学影像辅助诊断系统是利用计算机视觉和深度学习技术,帮助医生分析医学影像(如X光、CT、MRI等)并提供诊断建议的系统。本教程将开发一个基于ResNet的胸部X光肺炎检测系统。 2. 准备工作...

HJ106 字符逆序【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 HJ106 字符逆序 一、题目描述 二、测试用例 三、解题思路 基本思路:   考虑到可能会有多个空格,使用使用 getline 函数直接读取一行。   如果可以直接打印的…...

力扣HOT100之二叉树: 236. 二叉树的最近公共祖先

果然,这道题二刷还是不会做,回去看卡尔视频了。结合灵神的题解,我对这道题有了一些新的理解。 首先这道题还是用递归来做,由于我们需要计算两个节点的最近公共祖先,一定是从下往上来遍历,只有先判断左右子树…...

腾讯音乐一面

1、自我介绍项目(省略) 2、为什么存储要从TiDB迁移到Mysql? TiDB 迁移至 MySQL 核心原因总结: 成本优化 TiDB 需多节点集群(PD/TiKV/TiDB Server),硬件、运维及学习成本高。中小业务&#xff08…...

【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)

一、源码 该代码定义了一个类型系统中的零类型Z0,并为其实现了基本的算术运算(加法、减法、乘法、除法)。这是一个典型的类型级编程示例,使用Rust的类型系统在编译期进行数学运算。 //! 零类型(Z0)及其算术运算实现 //! //! 本…...

Pluto实验报告——基于2ASK的简易的通信系统

一、实验目的 1. 熟悉并掌握PLUTO SDR 主动学习模块的使用; 2.通过matlab 编码与adalm pluto 相配合达成一个简易的通信系统,并能 够传输一些较为简单的信息。 二、实验原理 2ASK 调制原理: 振幅键控是指利用载波的振幅变化来传递数字基带信…...

Python排序函数全面指南:从基础到高级

文章目录 Python排序函数全面指南:从基础到高级1. 两种主要排序方式2. 基本参数详解2.1 key参数:自定义排序规则2.2 reverse参数:控制排序方向 3. 高级排序技巧3.1 多级排序3.2 稳定排序 4. 性能考虑5. 特殊排序场景5.1 对自定义对象排序5.2 …...

深入了解redis的哈希槽的知识

目录 1、哈希算法分类 1.1、简单哈希算法 1.2、一致性哈希算法 1、原理: 2、解决问题 3、数据倾斜问题 4、虚拟节点 2. 哈希槽 2.1、介绍 2. 2、作用 1、数据分片(Sharding) 2、高可用性(HA) 3…...

农业机械化、电气化和自动化知网英文普刊:1天录用,2周见刊发表!

CSP科学出版社,旨在通过为研究人员提供最佳环境来发表、参考、阅读和引用他们的作品,从而为科学界服务。现已与科检易学术达成出版战略合作,现在联合共同出版高质量学术水平的期刊,为方便广大科研学者投稿方便,现已经建…...

java将rtsp转成flv在浏览器播放

1、添加maven依赖 <dependency> <groupId>io.github.javpower</groupId> <artifactId>rtsp-converter-flv-spring-boot-starter</artifactId> <version>1.5.9.2</version> </dependency> 2、在配置application.yml&#xff…...

Docker-Compose使用自定义网桥后在OpenWrt系统中容器无法访问网络解决方案

Docker-Compose使用自定义bridge网桥后在OpenWrt系统中容器无法访问网络解决方案 示例compose描述文件如下&#xff0c;注意最后网络配置&#xff1a; # docker-compose --env-file .env.yoko.prod.local up -d services:...postgres:image: kuluseky/postgres-zhparser-post…...

界面组件DevExpress WPF中文教程:Grid - 行和卡片

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

Qt enabled + geometry 属性(2)

文章目录 enabled属性可用与禁用的概念API接口代码演示 阐述说明1. 先简单描述下要如何演示出上面两个接口的效果&#xff08;思路&#xff09;2. 事先规范按钮对象的命名3. 定义两个按钮对象的槽函数 动图演示效果4. widget.cpp geometry属性预备知识API接口上下左右移动 ta…...