自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 资源 (1)
  • 问答 (3)
  • 收藏
  • 关注

原创 贝叶斯线性回归

贝叶斯线性回归概述​ 不同于频率派的线性回归Y=ωTX+ω0Y=\omega^TX+\omega_0Y=ωTX+ω0​,贝叶斯学派认为ωT\omega^TωT不是一个值固定的常量,而是由输入数据集data决定的一个分布,因此贝叶斯线性回归的预测结果也不是一个固定值,而是一个分布模型​ 输入数据集data={(x,y)∣x∈Rp,y∈R}data=\{(x,y)|x\in R^p,y\in R\}data={(x,y)∣x∈Rp,y∈R},定义X,YX,YX,Y之间的映射关系是:{f(x)=ωTx+

2021-08-22 17:03:25 886

原创 最短路径算法

应用场景: 狄克斯特拉用于解决单源最短路径问题,即从图中的某一节点出发到任一节点的最短路径。yue'shu

2021-06-15 09:16:15 1265

原创 2.窗体的创建及渲染循环

前面讲过了glfw封装了这一基础过程,因此本节只是API的基础使用方法,不做深入了解1.窗体创建GLFWwindow* Util::InitWindow(){ //初始化glfw,GLFW是一个专门针对OpenGL的C语言库, //它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入 glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); //OpenGL主版本号 gl

2020-11-16 14:04:28 248

原创 1.环境搭建

1.什么是OpenGL OpenGL是一个由Khronos组织制定并维护的规范(Specification),规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者(也就是显卡厂商)自行决定。2.GLFW GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。GLFW专门为OpenGL的开发完成了一些基础工作。获取的..

2020-11-16 13:46:59 198

原创 shared_ptr的设计与实现

参考博客:http://blog.csdn.net/hackbuteer1/article/details/7561235,本文在上述博客基础上使用了模板类来实现shared_ptr并且改进了一个小bug1.shared_ptr如何自动管理内存? 我们知道栈上的对象能够在生命周期结束时自动释放,而堆上new出来的对象只能手动delete,shared_ptr即是将普通指针包装起来,只使用shared_ptr的栈对象(如何只允许使用对象的栈对象呢?重载new运算符即可,不是本文重点),而当栈对象生命.

2020-11-11 16:52:59 339

原创 6.纹理

1.纹理采样:根据纹理坐标获取像素值2.纹理环绕:当纹理坐标超出默认范围时纹理的重复方式,OpenGL提供了以下几种方式对纹理环绕方式进行设置:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);float borderColor[] = { 1.0f, 1.

2020-09-07 15:57:46 130

原创 7.矩阵变换

1.使用OpenGL Mathematics,下载GLM后,将文件路径加入包含路径(不需要编译和链接)2.平移、旋转、缩放矩阵glm::vec4 vec(1.0f,0.0f,0.0f,1.0f);//默认是一个单位矩阵(9.9版本之后的GLM应改为glm::mat4 trans(1.0f);)glm::mat4 trans;//缩放trans = glm::scale(trans,glm::vec3(0.5,0.5,0.5));//旋转trans = glm::rotate(trans

2020-09-07 15:57:18 341

原创 算法学习之--最小生成树(Prim)

1.应用场景: 上一篇博客学习了图论基础https://blog.csdn.net/j_oop/article/details/108018641介绍了无权图的算法实现以及路径计算获取,在实际生产场景中带权图往往更接近实际需求。最小生成树解决的是在n个顶点中找到n-1条边使得所有顶点全部连通并且n-1条边的权重之和最小(针对无向图)。2.带权图的算法实现 上一篇博客介绍了在稠密图中,我们使用一个n*n(n为顶点数)的邻接矩阵(二维bool数组)mp_graph存储顶点之间的连接关系,mp_g..

2020-09-07 15:54:58 232

原创 5.Shader

1.使用in、out关键字声明shader中的输入和输出变量 为输入变量传值有两种方式: (1)在着色器中声明变量时使用location = t关键字指定顶点属性位置(顶点着色器需要提供一个额外的layout标识),在程序中通过t进行赋值 (2)在程序中使用glGetAttribLocation(变量名)获取变量的地址,然后再进行赋值2.在顶点着色器和片元着色器之间传值: 如果我们打算从一个着色器向另一个着色器发送数据,在发送方着色器声明一个输出变...

2020-09-06 09:28:55 137

原创 3.VAO,VBO,EBO

1.缓冲区的使用: //创建顶点缓冲区 GLuint VBO,VAO,EBO; glGenVertexArrays(1,&VAO); glGenBuffers(1,&VBO); //该函数用于生成缓冲区对象名称 glGenBuffers(1,&EBO); //绑定缓冲区 glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFF

2020-09-06 09:27:19 186

原创 20.初始化着色器

1.基本步骤: (1)创建着色器对象(gl.createShader()) (2)向着色器对象中填充着色器程序的源代码(gl.shaderSource()) (3)编译着色器(gl.compileShader()) (4)创建程序对象(gl.createProgram()) (5)为程序对象分配着色器(gl.attachShader()) (6)连接程序对象(gl.linkProgram()) (7)使用程序对象(gl.userProgr...

2020-09-06 09:23:08 213

原创 17.光照(点光源)

1.点光源产生的漫反射光 <漫反射光颜色>=<入射光颜色>x<表面基底色>x cosB <漫反射光颜色>=<入射光颜色>x<表面基底色>x(<光线方向>x<法线方向>) 由于点光源产生的光线在物体表面任意一点的入射角度都不相同,需要先计算入射方向矢量(由点光源指向顶点),根据矢量做减法在几何中的意义: <光线方向>=<光源位置矢量>-<...

2020-09-06 09:20:46 863

原创 16.光照(平行光)

1.基本概念: 着色:根据光照条件,重建“物体表面明暗不一效果”的过程 光源类型: (1)平行光:没有衰减的平行的光线,类似于太阳光。用一个方向和一个颜色定义。 (2)点光源:理想化为质点点光源,类似于人造灯泡,有光线衰减。用光源位置和颜色定义。 (3)环境光:用于模拟真实世界中的非直射光(由光源发出经过墙壁或其他物体反射的光)。只需要指定颜色。 反射光取决于以下两个因素: (1)入射光(入射光的方向和颜色...

2020-09-06 09:17:55 3896

原创 15.通过索引访问顶点数据

1.绘制立方体: 使用gl.drawArrays方法以gl.TRIANGLES方式绘制需要定义36个顶点,以gl.TRIANGLE_FAN绘制需要24个顶点,但是需要调用6次drawArrays方法。WebGL提供了解决方案:gl.drawElements();API:gl.drawElements(mode,count,type,offset),避免重复定义顶点,保持顶点数量最小 mode:指定绘图方式 count:绘制顶点个数(整型) ...

2020-09-06 09:13:43 272

原创 14.隐藏面消除

1.隐藏面消除:虽然透视投影已经将场景的深度效果表现了出来,但是要想得到真实的立体效果还需要将物体的前后遮挡关系正确的显示出来。遗憾的是WebGL并没有那么智能 WebGL在默认情况下会按照缓冲区中的顺序绘制图形,而且后绘制的图形覆盖先绘制的图形。但是WebGL提供了隐藏面消除功能: (1)开启隐藏面消除功能:gl.enable(gl.DEPTH_TEST); (2)在绘制之前清除深度缓冲区gl.clear(gl.DEPTH_BUFFER_BIT);2.gl...

2020-09-06 09:11:19 466

原创 13.可视空间

1.可视空间:实际观察得到的区域边界。可视空间由水平视角、垂直视角、可视深度(能看多远)定义。2.分类: (1)四棱锥/金字塔可视空间,由透视投影产生。产生的三维场景看上去更有深度感(第一人称射击游戏) (2)长方体可视空间,也称盒状空间,由正射投影产生。物体的大小与其所在位置没有关系,用户可方便地比较场景中地物体(比如建筑平面图)。3.盒状空间(长方体可视空间)盒状空间由前后两个矩形表面确定,分别称为近裁剪面和远裁剪面,前者四个顶点坐标是(right,top,-near),...

2020-09-06 09:08:15 784

原创 12.三维场景绘制

1.基本概念: (1)视点:观察者所处的三维空间中的位置称为视点,视点坐标用(eyeX,eyeY,eyeZ)表示 (2)视线:从视点出发沿着观察方向的射线称作视线。 (3)观察目标点:被观察目标所在的点,以此来确定视线。视线穿过观察目标并继续延伸。观察目标点坐标用(atX,atY,atZ)表示 (4)上方向:最终绘制在屏幕上的影像中的向上的方向,用(upX,upY,upZ)表示。(因为仅确定了视点和观察点,观察者还是可能以视线为轴进行旋转) 根据上述三个矢量...

2020-09-06 09:03:57 334

原创 11.GLSL ES

1.数据类型:GLSL ES支持两种数据值类型:数值类型(整型、浮点型)和布尔值类型。GLSL ES不支持字符串类型2.矩阵和矢量:GLSL ES中,矢量和矩阵的初始化方法遵从一般规律,特别的:初始化矢量时,只传入构造器一个参数,那么构造器会自动地将这个参数赋值给新建矢量的所有元素,如果传入不止一个参数且数量少于矢量元素个数,那么报错;初始化矩阵时,向构造器中传入一个参数,该矩阵代表对角线上元素全是该数值,其余元素全部为0的矩阵,如果传入参数数量大于1又没有达到矩阵要求的个数,那么报错。3.

2020-09-06 09:00:46 439

原创 10.纹理

1.纹理坐标:st坐标系统,纹理左边的原点位于图像左下角,图像右上角的坐标始终是(1.0,1.0)2.纹理坐标与WebGL坐标的映射:3.纹理映射:根据纹理图像,为之前光栅化后的每个图元图上合适的颜色,组成纹理图像的元素称为纹素。4.纹理映射的过程: (1)准备好映射到几何图形上的纹理图像 (2)为几何图像配置纹理映射方式(几何图形的某个片元的颜色取决于纹理图像中哪个像素) (3)加载纹理图像,对其进行一些配置,以在WebGL中使用 (4)在片元着色器...

2020-08-30 20:24:57 323

原创 9.着色器原理详解

1.几何图形装配(图元装配):将孤立的顶点坐标装配成几何图形。几何图形的类别由gl.drawArrays()函数的第一个参数决定,装配出来的基本图形(点、线、面)被称为图元2.光栅化:将装配好的几何图形转化为片元。3.几何图形装配和光栅化过程:光栅化完成后程序逐片调用片元着色器 例如下面程序中着色器的执行过程是: (1)顶点着色器执行三次,获得三角形的顶点坐标并存放在图形的装配区(有多少顶点就执行多少次) (2)开始装配图形,使用传入gl_Posit...

2020-08-30 20:16:53 922

原创 8.实现动画

1.动画的实现原理就是不停的对canvas进行重绘2.resquestAnimationFrame(func):请求浏览器在未来某个时刻回调函数func以完成重绘function tick(){ //绘图操作 requestAnimationFrame(tick);} setInterval()方法可以实现在指定时间间隔调用某方法,但是现代浏览器每个标签页具有独立的JavaScript环境,非激活状态下setInterval()方法仍然会运行,增加浏览器负荷3.实..

2020-08-30 20:13:47 117

原创 7.移动旋转和缩放(矩阵)

1.逆时针(正旋转):如果旋转角是正值,观察者在Z轴正半轴某处,视线沿着Z轴负方向进行观察,那么看到的物体是逆时针方向旋转的。2.右手法则旋转:右手握拳,大拇指伸直并使其指向旋转轴的正方向,那么右手其余手指就指明了旋转的方向。3.平移矩阵:如图:x' = x + Tx ; y' = y + Ty ; z' = z + Tz;则平移矩阵就是:4.旋转矩阵:在二维平面中,x' = x * cosB - y * sinB ; y' = y * sinB + y * cosB ;

2020-08-30 20:11:25 3633

原创 6.基本图形绘制

WebGL提供了方法drawArrays()用于绘制基本图形gl.drawArrays(mode,first,count); mode:指定绘图方式,可接受以下常量 first:指定从哪个点开始绘制 count:指定本绘制需要用到多少个顶点注意:不同的图形类型,点之间的连接方式不同,需要格外注意点的存储顺序...

2020-08-30 20:04:24 178

原创 5.缓冲区

1.缓冲区对象:缓冲区对象是WebGL系统中的一块内存区域,我们可以一次性向其中填充大量的顶点数据,供顶点着色器使用。2.使用缓冲区对象步骤: (1)创建缓冲区对象//gl是canvas的上下文对象var vertexBuffer = gl.createBuffer(); (2)绑定缓冲区对象gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer); API:gl.bindBuffer( target,buffer ),允许使用buf...

2020-08-30 20:00:49 261

原创 4.每次点击绘制一个点

重点:1 . 用户坐标转换成canvas坐标 2 . 为什么使用匿名函数 3 . 为什么每次点击都要设置背景色var VSHADER_SOURCE = 'attribute vec4 a_Position;\n' + 'attribute float a_PointSize;\n' + 'void main(){\n' + 'gl_Position = a_Position;\n' + 'gl_PointSize = a_PointSize;\n' +

2020-08-30 19:55:15 189

原创 3.坐标系统

1.用户坐标系:右手直角坐标系,原点为左上角,X轴为水平方向(正方向向右),Y轴垂直(正方向向下),Z轴垂直于屏幕(正方向向外)2.canvas坐标系:原点位于canvas中心,X轴水平向右,Y轴垂直向上,canvas左边缘为(1,0,0),上边缘为(0,1,0)3.鼠标事件获取的用户坐标系转换到canvas坐标系: (1)获取触发事件的对象相对于视口(用户坐标系)的大小及位置 (2)将用户坐标转换成相对于canvas左上角位置的坐标 (3)将坐标原点平移至ca...

2020-08-30 19:53:34 166

原创 2.着色器(shader)

1.什么是着色器:着色器提供了灵活且强大的绘制二维和三维图形的方法,所有WebGL程序必须使用它。着色器处理完的结果存储在颜色缓冲区中。2.几种着色器: 顶点着色器(Vertex shader):用来描述顶点特性(如位置、颜色等)的程序。 顶点着色器对图像的顶点逐点进行处理,即要执行n次(n为顶点个数) 片元着色器(Fragment shader):进行逐片元处理过程如光照的程序。3.JavaScript与着色器程序的执行过程:...

2020-08-30 19:47:48 3267

原创 算法学习之--图论基础

1.图论基础: 一个图由顶点集(V)和边集(E)组成,每一条边就是一个点对(v,w),其中。如果点对是有序的(即v,w与w,v不同),那么图就是有向图,否则称作无向图(无向图是特殊的有向图)。如果在边集中允许出现(w,w)这种一个顶点的点对,这种边称为自环边。如果边集中允许出现多组相同的点对,这样的边称为平行边。2.图的表示 图的表示实际上就是对图中边的存储,每条边由两个顶点组成 (1)邻接矩阵:假设图中有n个顶点,那么图中的边有(n*n)种可能,使用n*n的二维矩阵(bool[][...

2020-08-25 13:09:21 311

原创 算法学习之--并查集

1.应用场景: 并查集用于解决连接类问题,判断网络中节点间的连接状态。与路径类问题相比,并查集只回答了节点之间是否连通,而具体的连通路径并不能确定,因此并查集非常高效。

2020-08-09 17:03:20 129

原创 算法学习之---二分搜索树

1.应用场景: 二分搜索树解决的是查找类问题,在数据有序的基础上,二分搜索树的查找效率为O(logN)。2.二分搜索树: 是一个二叉树,满足条件1.所有节点的值大于其左子节值点小于其右子节点值;2.所有节点的值大于其左子树所有节点值,小于右子树所有节点值。3.算法实现: 下面代码实现了二分搜索树的插入,删除,遍历(前序、中序、后续、广度优先),查找等操作/*************************************************************...

2020-07-24 00:26:46 593

原创 算法学习之--最大堆与索引堆

最大堆 数据结构上,最大堆是一种特殊的完全二叉树(父节点的值一定大于子节点,也叫最大完全二叉树),在本算法实现中将二叉树从上至下从左至右进行编号(索引从1开始,为了方便计算叶子节点索引值),根据编号顺序将元素值存入数组。 算法实现如下,关键点在于二叉树节点索引值的维护和#pragma once#include <cassert>#include "SortTestHelper.h"/*******************************************...

2020-07-14 18:35:05 187

原创 QT之初识QSS

1.QT官方文档学习,提炼如下: QSS机制用于设置窗体的外观,使用方式与CSS非常相似。 使用setStyleSheet方法设置窗体或者整个应用的样式表(style sheet),如果在不同的窗体继承级别中设置了不同的样式表,QT将从所有设置中派生出一个合适的样式表,因此样式设置是串行的(cascading)。Style Sheet实现在widget style之上,但它能够保证在所...

2020-06-14 22:44:42 296

原创 算法学习之--进阶排序算法(时间复杂度O(nlogn))

1.归并排序 基本思想:不断的将数据进行二分(逻辑上的二分,即将数组元素索引分块,并不是真的把数组内存进行二分),当二分到只有一个数组元素时开始归并,数组的每一个元素由其二分后数组的两个元素进行比较确定:首先进行二分:二分到第三层数组中仅有一个元素(即数组有序),然后开始向上进行归并:第二层左边的数组 [ 0 ] 位置元素由其二分后数组元素比较得出,显然应该是3,那么 [ 1 ]位置就是6,同理第二层右边数组归并后是1,4。再次向上归并,第一层数组[0]位置由其二分数组【3,6】【1,4..

2020-06-13 23:52:52 758

原创 C++Lambda表达式基本用法

1.基本语法:[ 捕捉块 ](参数列表)->返回值 { 函数体 };捕捉块:定义lambda函数所在的作用域中的指定变量可以在lambda函数中使用;2.用法示例: (1)打印输出auto basicLambda = [](){ cout<<"hello from lambda"<<endl;};basicLambda(); (2)返回值auto basicLambda = [](int a,int b)->int{ ..

2020-06-13 17:46:49 331

原创 成员函数的回调函数

使用回调函数调用成员函数,重点在于成员函数的声明方式和调用1.成员函数指针的声明:typedef 返回值(ClassName::* funcPtrName)(参数1 &param1,参数2 &param2)2.回调函数的定义void callbackName(ClassName * classPtr,funcPtrName func,参数列表){ (classPtr->*func)(入参);}3.程序中回调函数的调用callbackName( cl

2020-05-31 23:48:48 223

原创 地图分幅规则

地图列比例尺数据分幅编号标准: 标准地图比例尺主要包括包含1:100万,1:50万,1:25万,1:5万,1:25万,1:1万七种比例尺。 其中,1:100万,1:50万,1:25万,1:10万都是以1:100万编号为基础:百万图照先纬度,后经度的方式进行计算,百万图图幅经纬度范围为6度和4度。如北纬24-28度,东经114-120度,这副图的编号为N(北纬)07(28/4=7)50((120+180)/6=50),即N0750。 50万图是百万图再分四块,二乘二,右下角是第四块,即N075...

2020-05-31 14:39:57 3467

原创 算法学习之-编写测试用例

我们在测试算法性能时,用到最多的是使用生成的随机数组进行测试,比较简单但还是有几个需要注意的地方,下面先给出代码:#include <ctime>#include <iostream>#include <cassert>//生成[min,max]范围内的size个随机数的数组static int* generateTestArr(int size,int min,int max){ assert(min<=max); int * arr =

2020-05-28 13:49:42 1481

原创 算法学习之-基本排序算法(时间复杂度O(n^2))

选择排序的基本逻辑是:从0开始遍历选出最大值与0位交换,从1开始遍历再次选出最大值与1交换........,下面是代码,使用模板方法实现且增加了如何对自定以类进行排序#include "stdafx.h"#include <iostream>#include <string>using namespace std;///选择排序,每次循环选出最大值,依次放到数组的[0][1][2]....中template <class T>void selecti

2020-05-27 13:57:06 291

原创 QT中的模型视图架构(持续更新)

做项目中深深体会到了传统QTreeWidget编辑数据后内存数据、硬盘数据、树形结构数据不同步带来的不便,遂决定学习一下视图模型架构,搜了一些博文,感觉都没有官方教程上讲的流畅,于是写下这篇博客,翻译官方教程并作适当删减。1.介绍: 模型/视图架构用于将窗体中展示数据的视图和数据进行分离。标准窗体控件(widget)并没有将数据从视图中分离,所以QT4中存在两种看起来相同但与数据交互不同...

2020-05-10 22:52:53 1211

原创 C++实现文本编码判断

1.概述 C++实现对utf-8,utf-8(BOM),utf-16 LE,utf-16 BE编码的文本文件进行编码判断,其中多数编码均有固定文件头,在此不赘述,难点在于utf-8(无BOM)的判断。2.代码实现///传入参数为文件名,返回值为编码名称string readFile(QString fileName)///判断字符串是否为utf-8(无BOM)编码,si...

2020-05-02 18:50:52 1817

TileConvert.rar

基于QT的瓦片转换实现,例如:将最高level 0,最低level 4,最高level瓦片数量2x4,瓦片大小256x256的瓦片转化成将最高level -4,最低level 0,最高level瓦片数量5x10,瓦片大小512x512的瓦片,笔者只测试了工作用到的瓦片规则,不知道其他规则下会不会有bug,但基本实现思路是一致的。额,最近测出一个bug,但是资源我还不知道怎么撤销,在博客中已经改正https://blog.csdn.net/j_oop/article/details/105035752

2020-03-22

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除