- 博客(50)
- 收藏
- 关注
原创 OpenGL:中点直线算法
中点直线算法是通过在像素中确定与理想直线最靠近的像素来进行扫描转换的。在上图中,假设直线的斜率0≤m≤1。假设当前最近的像素已经确认为Pxkyk,由于x位最大的位移方向,因此直线在x方向上每次增加一个像素单位,而在y方向上是否增加一个像素单位,即P点的下一个点是选P1xk1yk还是P2xk1yk1,取决于两个备选像素哪一个离理想像素最近设Mxk1yk0.5位P1P2的中点,
2024-06-23 09:13:51 813
原创 DDA直线算法
假设给定直线段的起点坐标x0y0和终点坐标x1y1ykxb其中kx2−x1y1−y2by0−kx0DDA直线算法就是在上一个点的基础上x和y加上一个增量,求下一个点的坐标:::info由xiyi求xi1yy1的过程:当∣k∣≤1xi1xi1yi1kxi1bkxi1byib当∣。
2024-06-22 08:38:06 687
原创 OpenGL绘制Bezier曲面
贝塞尔曲面是贝塞尔曲线在二维上的扩展。它由一组控制点定义,通过这些控制点生成光滑的曲面。贝塞尔曲面通常用两个参数u和v来表示,这两个参数的取值范围都在 [0, 1] 之间。
2024-06-20 10:29:20 1112
原创 OpenGL绘制B样条曲线
B样条曲线(B-spline curves)是一种基于样条函数(spline function)的分段多项式函数,广泛用于计算机图形学、数据拟合和数值分析中。B样条曲线有许多优点,如局部控制、平滑性和灵活性。
2024-06-19 11:28:53 1483
原创 OpenGL绘制Bezier曲线
贝塞尔曲线还可以用德卡斯特里奥算法(De Casteljau’s algorithm)递归地计算。对于给定的控制点集P0P1PnP0P1...Pn和参数tttPi0P_i^{(0)}Pi0PiP_iPiPir1−tPir−1tPi1r−1,其中r12nP_i^{(r)}=(1-t)P_i^{(r-1)} +tP_{i+1}^{(r-1)},其中r=1,2,...,nPir1−tP。
2024-06-18 15:59:54 1326
原创 OpenGL超级宝典 纹理(一)
1. 创建纹理对象2. 分配纹理缓存空间3. 绑定纹理对象到OpenGL上下文,告诉OpenGL纹理的类型4. 更新纹理数据5. 控制纹理数据的读取方式 5.1 创建采样器对象 5.2 设置纹理过滤方式
2022-03-24 00:10:15 1492
原创 OpenGL超级宝典 完整渲染管线画圆
圆的画法直接上代码吧。Shader类是上一篇文章的shadervertex shader#version 450 corelayout(location = 0) in vec3 aPos;void main(){ gl_Position = vec4(aPos, 1.0);}tec shader#version 450 corelayout(vertices = 3) out;void main(){ if(gl_InvocationID == 0) { /
2022-03-05 11:54:56 683
原创 OpenGL超级宝典 使用缓冲为顶点着色器提供数据
1. 创建vao并且绑定过到OpenGL上下文2. 创建vbo3. 为vbo分配内存空间4. 将vbo绑定到OpenGL上5. 将vbo绑定到vao上6. 设置数据的布局和格式7. 指示vao的顶点属性应该从哪个绑定点获取数据8. 启用顶点数据
2022-03-05 11:44:48 1332
原创 OpenGL超级宝典 插值以及bezier曲线
插值概念bezier曲线vertex shadertesc shadertese shaderfragment shaderShader类在前面的文章中有,这里不在提源代码效果图概念插值(Interpolation)表示寻找一系列已知点之间的值的过程。穿过A点和B点的直线的公式如下:P = A + tD其中,D=(B-A)因此该公式可写成P = A + t(B - A)或 P = (1-t)A + tBGLSL中有mix()函数可以进行插值计算bezier曲线vertex shad
2022-03-02 00:01:05 959
原创 OpenGL超级宝典 渲染管线(四)
渲染管线渲染管线总图顶点着色器细分曲面控制着色器细分曲面引擎细分曲面评估着色器几何着色器基元装配裁剪剔除光栅化片段着色器帧缓存还有很多不懂的,所以写的很粗糙。欢迎大家提出改正。渲染管线总图顶点着色器顶点着色器作为管线的第一个阶段,它的作用其实很简单,就是接收外界输入的数据。这些数据是渲染图形必不可少的,所以说顶点着色器是管线中必需的一个阶段。并且数据可以传递到下一个着色器中。细分曲面控制着色器1.细分曲面控制着色器的数据从顶点着色器中获取,顶点着色器将数据作为输出,细分曲面控制着色器作为输
2022-02-28 23:13:37 444
原创 OpenGL超级宝典 渲染管线(二)
细分曲面分成了三部分,首先是细分曲面控制着色器,这个着色器主要是设置细分因子,也就是细分的程度。然后是固定的细分曲面引擎,将接收到的贴片(patch)细分成点、线或者三角形最后是细分曲面评估着色器,这里进行细分算法的编写,并且输出
2022-02-26 10:31:54 426
原创 OpenGL超级宝典 渲染管线(一)
自己封装的Shader类(后面继续改进)shader.h#pragma once#include "sb7.h"#include <string>class Shader{public: Shader(); Shader(const std::string vertexPath, const std::string fragmentPath); //program对象使用 void use();private: GLuint program; //源代码 std
2022-02-24 23:07:24 281
原创 OpenGL超级宝典 绘制第一个三角形
顶点着色器#version 450void main(){ //三角形的顶点 const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0), vec4(-0.25, -0.25, 0.5, 1.0), vec4(0.25, 0.25, 0.5, 1.0)); //gl_Vert.
2022-02-22 23:32:31 182
原创 OpenGL超级宝典 绘制第一个点
#include "sb7.h"#include <math.h>GLint complie_shaders(){ GLuint vertex_shader, fragment_shader, program; //顶点着色器源代码 static const char* vertex_shader_source[] = { "#version 450 \n" " \n" "void main() \n"
2022-02-22 23:11:00 194
原创 OpenGL超级宝典(第7版)环境配置和相关问题
资源获取资源可以去异步社区或者官网下载,自行去网上找。环境配置资源处理将资源压缩到合适的位置,注意目录中不能含有中文使用CMAKE,生成VS项目来编译glfw打开项目,分别生成Debug和Release的项目解决方案将glfw编译生成的Debug文件中的glfw3.lib文件复制到资源第一级目录下的lib文件夹中去将Debug文件夹复制过来的glfw3.lib改名为glfw_d.lib同理,将glfw编译生成的Release中的glfw3.lib复制到lib文件夹中,此时不需要
2022-02-22 11:39:24 1646 10
原创 SQL创建存储过程
创建SQL存储过程需要使用到的语法- 创建存储过程CREATE 存储过程的名称(参数)BEGIN...需要执行的SQL语句END- 调用CALL 存储过程的名称(参数)个人看法,这就是一个函数...无参数CREATE PROCEDURE p_student_select()BEGIN SELECT * FROM student;ENDCALL p_student_select()带参# out其实就是cpp里的引用变量,in就是值传递CREATE PROCEDUR
2021-11-18 10:44:09 24553
原创 C++线程启动、结束,创建线程方法
线程启动、结束,创建线程方法、join,detach* 程序运行起来,生成一个进程,该进程的主线程自动开始运行* 主线程从main函数开始执行,那么自己创建的线程,也需要从一个函数开始运行(初始函数)。一旦这个函数运行完毕,代表该线程结束。* 整个进程是否执行完成完毕的标志是 主线程是否执行完毕,如果主线程执行完毕了,代表整个进程执行完毕。 此时,一般情况下,如果其他子线程没有执行完毕,那么这些子线程就会被操作系统强行终止。 所以,一般情况下,如果想要保持子线程的运行状态,那么要让主线程一直保持,
2021-11-02 09:14:30 2816 2
原创 OpenGL(可编程管线):Shader + Bezier曲面 +QT
Bezier曲面前面的博客已经介绍,本次绘制Bezier曲面使用了细分着色器直接上代码#pragma once#include <vector>#include <qopenglfunctions_4_4_core.h>#include <iostream>#include <qmatrix4x4.h>#include "Shader.h"#include <string>using namespace std;class B
2021-08-25 21:19:52 435
原创 OpenGL(可编程管线):Bezier曲面
Bezier曲面Bezier线de Casteljau算法Bezier曲面bezier曲面编程思想实例代码运行结果Bezier线贝塞尔曲线由一组参数方程定义,方程组中使用控制点指定特定的曲线的形状,每个控制点都是2D空间中的一个点。de Casteljau算法其中B(t)为Bernstein多项式,另外了解,这里不做解释(主要是没有深入研究…)。此图来自《计算机图形学编程(使用OpenGL和C++)》Bezier曲面Bezier曲面定义了3D空间中的曲面,从Bezier曲线拓展,需要将b
2021-07-23 16:23:27 3575 2
原创 OpenGL(可编程管线):椭球的绘制和贴图
通过构建圆形顶点,再将这些顶点组合成三角形,即可得出最后的图形。纹理坐标就是通过投影计算得出。代码构建类运行结果构建类#pragma once#include <vector>#include <glm/glm.hpp>using namespace std;class Ellipsoid{private: //顶点个数 int numVertices; //索引个数 int numIndices; //顶点 vector<glm::ve...
2021-07-21 22:05:49 429 1
原创 OpenGL(可编程管线):椭圆的绘制和贴图
和绘制圆一样的思路,八分法绘制椭圆,借助上面的参数方程,以原点为(0,0)为例,上代码:椭圆的绘制构建椭圆类代码解释运行结果情况一:长轴在x轴情况二:长轴在y轴![在这里插入图片描述](https://img-blog.csdnimg.cn/20210719221241134.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h0X3ZJQw==,.
2021-07-19 22:29:24 1264 2
原创 OpenGL(可编程管线):使用八分法绘制圆
简单概括就是把圆分成很多份上代码:为圆创建一个类#pragma once#include <vector>#include <glm\glm.hpp>using namespace std;class Circle{private: //顶点个数 int numVertices; //索引个数 int numIndices; //存储顶点 vector<glm::vec3> vertices; //索引 vector<int&g.
2021-07-17 09:36:36 720
原创 学习笔记:非阻塞式NIO
Java NIO非阻塞模式当线程从某通道读写数据时,若没有数据可用时,该线程可以进行其他任务。即线程空闲时可以进行其他任务,单独的线程可以管理多个输入输出通道,大大提高了CPU使用率。选择器(Selector)选择器可以让一个线程控制多个通道。Selector是非阻塞IO的核心。选择器的使用创建选择器 //获取选择器 Selector selector = Selector.open();向选择器注册通道 //将通
2021-02-06 14:36:56 202
原创 学习笔记:ObjectOutputStream和ObjectInputStream
对象流的作用对象流用于存储和读取基本数据类型或对象的处理流。可以把Java中的对象写入数据源中,也能从数据源中还原对象。序列化序列化机制:对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。ObjectOutputStream内存中的Java对象就是通过ObjectOutputStream保存到磁盘中或者通过网络传输出去Ob
2021-02-03 17:11:12 232
原创 Java实现文件和文件夹复制
实现方法public Boolean copyFile(String srcPath, String desPath)public Boolean copyFiles(String srcPath, String desPath)public Boolean copyFile(String srcPath, String desPath)这个方法当做工具,用于复制单个文件public Boolean copyFile(String srcPath, String desPath) {
2021-02-03 16:45:28 267
原创 学习笔记:Java IO流
Java IO流Java IO原理流的分类节点流处理流流之间的关系图流的使用缓冲流Java IO原理I/O是Input/Output的缩写,I/O技术是用于处理设备之间的数据传输在Java中,数据的传输是通过“流(Stream)”的方式进行流的分类按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)按数据流的流向不同分为:输入流,输出流按流的角色的不同分为:节点流,处理流节点流节点流:直接从数据源或目的地读写数据(文件操作)处理流处理流:不直接从数据源或目
2021-02-01 23:05:36 194
原创 线程练习:生产者-消费者问题
生产者-消费者问题问题描述wait()/notify()/notifyall()方法Lcok和Condition问题描述生产者(Productor)将产品交给店员(Clerk),而消费者(Consumer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。wait()/notify()/notifyall()方
2021-01-30 16:39:34 223
原创 多线程的创建、同步
多线程的创建和同步线程的六种状态新建(NEW)可运行(RUNNABLE)终止(TERMINATED)等待(WATING)计时等待(TIMED_WATING)阻塞(BLOCKED)线程的生命周期线程的创建继承Thread类实现Runnable接口实现Callable接口使用线程池创建线程线程的同步同步代码块继承Thread类的写法实现Runnable接口的写法同步方法继承Thread方法实现Runnable接口线程的六种状态新建(NEW)至今尚未启动的线程处于这种状态。可运行(RUNNABLE)一旦
2021-01-28 19:04:47 550
原创 JDBC连接操作步骤(mysql在eclipse和idea中的操作)
小知识:JDBC是一个注册了商标的术语,而并非Java Database Connectivity 的首字母缩写。对它命名体现了对ODBC的致敬,后者是微软开创的标准数据库API,并因此并入了SQL标准中。—摘自 《Java 核心技术 卷Ⅱ》JDBC操作步骤导入驱动程序JAR文件注册驱动器连接数据库代码展示导入驱动程序JAR文件eclipse中的导入jar包步骤idea中设置在idea设置中需要设置数据库的serverTimeZone为gmt注册驱动器许多JDBC的JAR文件会自动注.
2021-01-18 00:05:16 394 3
原创 [LeetCode]1018可被5整除的二进制前缀
1018可被5整除的二进制前缀题目详情题目分析代码(Java)代码分析题目详情给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。示例 1:输入:[0,1,1]输出:[true,false,false]解释:输入数字为 0, 01, 011;也就是十进制中的 0, 1
2021-01-14 22:58:19 146
原创 Java分析栈堆轨迹元素的两种方法
Java分析栈堆轨迹元素官方定义:栈堆轨迹是程序执行过程中在某个特定点上所有挂起的方法调用的一个列表。我的理解:栈堆轨迹就是程序执行过程调用方法的顺序列表和文件名和行数。有两种方法可以访问栈堆轨迹的文本描述信息文章目录Java分析栈堆轨迹元素Throwable类StackWalker类Throwable类使用Throwable类的printStackTrace()可以访问栈堆轨迹的信息。这个方法也可以打印异常的信息。下面以阶乘的计算作为示例代码。 public static int fa
2021-01-09 17:32:52 308 3
原创 IDEA进行GUI设计时的组件拖拽操作
使用IDEA版本:2020.1.3很多朋友对于GUI的设计最大的烦恼就是一边写代码,一边运行代码进行布局设计,在IDEA中其实自带一个GUI设计的功能,让我们进行GUI设计更加的方便,快速。单击这个按钮可以直接创建一个GUI类在创建的时候可以设置GUI的布局...
2021-01-02 19:58:44 4261
原创 栈的应用之逆波兰计算器练习
文章目录创建操作运算符的类计算器将中缀表达式转成后缀表达式计算器实现创建操作运算符的类public class Operation { private static int ADD = 1; private static int SUB = 1; private static int MUL = 2; private static int DIV = 2; //获取运算符优先度 public static int getValue(String oper
2020-11-03 20:32:50 242 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人