自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 资源 (16)
  • 收藏
  • 关注

原创 数据结构---二叉树(2)---平衡二叉树(4 插入)

0.简介前面主要的二叉树理论部分介绍,这里开始实践。1.插入输入一个元素,树在插入的过程中就会调整。#include<iostream>#include <algorithm>using namespace std;struct TreeNode{ TreeNode(){} TreeNode(int n,int h):num(n),height(h) {} int num = 0; int height = 0; TreeNode* left =

2020-05-23 21:15:31 193

原创 数据结构---二叉树(2)---平衡二叉树(3)

0.简介前面分析了平衡二叉树是怎么调整平衡的,这里就来解决另一个问题,平衡二叉树理论为什么能成立?难道就不会有怎么调都不会平衡的情况吗?一起探究一下吧。1.平衡二叉树我在很早的时候就注意到了一个问题。二叉树变形上图中是一颗不平衡的二叉树向平衡调整的一部分过程,这个过程中我发现,子树a,b,c,d的左右关系始终都是不变的,就是从左到右来看始终都是a,b,c,d这个顺序,并且圆圈里的BCA这三个节点的顺序也始终都是不变的,那变化的是什么呢?从图中我们只能观察到,变化的是树的形状。因为平

2020-05-22 16:37:30 894

原创 数据结构---二叉树(2)---平衡二叉树(2)

0.简介上一篇说到了平衡二叉树不平衡的一种情况,这次我们来看另一种情况。1.平衡二叉树不平衡的情况根据上一篇的介绍,对于这种情况,我们先考虑将A节点降低来配合C节点的深度。调整树上图中,我将C又收回去了,因为这里的调整和C没什么关系,我们发现,调整好后,树仍然是不平衡的!虽然将A中的子树与原来B中的子树(阴影部分)达到了平衡,但是却升高了B的另一个子树,导致再次不平衡,看来用上一篇的方法对付这种情况不好用了。调整树我们看新的这条调整路线,将A节点拿下来后,并没有直接将C

2020-05-21 21:44:44 285

原创 数据结构---二叉树(2)---平衡二叉树(1)

0.简介本次我来简单做一个平衡二叉树的推导,意在了解平衡二叉树的旋转方法是怎么来的,还有就是我记不住LL,RR这都是啥意思,所以决定找个好理解的方法,应该说是我能理解的方法。1.平衡二叉树平衡二叉树有个规则,首先是有序,然后就是一个节点的左右子树的高度差不能超过1。也就是差是2以及以上就是不平衡了,因为平衡二叉树是时刻都在调整平衡,所以差顶多就是2了。来看一下不平衡的情况是什么。下面采用手绘图来表达。不平衡情况上图中我们不难看出,这种情况是不平衡情况,相对的还可以是右子树深左子树浅

2020-05-21 02:28:48 410

原创 数据结构---二叉树(1)

0.简介本篇博客是为面平衡二叉树,B树,红黑树铺垫,所以这里就简单实现创建一个树。1.创建树代码中有详细注释,就不再写多余的句子了。这个树的创建是根据左小右大的顺序建成。#include<iostream>#include <algorithm>using namespace std;struct TreeNode{ int num = 0; int height = 0; TreeNode* left = nullptr; TreeNode*

2020-05-21 00:26:53 250

原创 自制编程语言(13)---中间码---二元表达式加法

0.简介二元运算有很多,这里只用加法来举例子。1.中间变量在获得二元表达式的时候,要有中间结果在存储,所以要暗中处理中间结果。一下是二元表达式计算中间代码的方法。operand BinaryExpression::evaluation(std::vector<Quaternion>& stms, Memory& memory, NameTable& table){ operand result; operand rightValue = rig

2020-05-18 17:24:56 269

原创 自制编程语言(12)---中间码---赋值

0.简介赋值操作可以认为是移动操作,类似汇编里mov1.赋值这里赋值就是将一个变量的值给另一个变量,由于具体的值获取要在执行期间才可以获取,所以赋值生成的代码都是用地址来进行访问赋值。2.实现先修改一个地方。//变量记录表,栈型class NameTable{public: NameTable() {} ~NameTable() {} //类别,数值,地址,变量名字 std::vector<std::tuple<int, int,int, std::str

2020-05-18 15:10:40 294

原创 自制编程语言(11)---中间码---变量声明的中间码

0.简介变量声明需要有中间码来操作,这里设计成入栈的操作。1.实现struct operand{ operand(){} //类型,数值,数值类别(数值,地址) operand(int t,int n,bool addr):vaild(true), address(addr),num(n),type(t){} bool vaild = false; bool address = true; int num; int type;};enum OP{ ADD, ASSIG

2020-05-17 21:37:04 345

原创 自制编程语言(10)---辅助虚拟环境---内存

0.简介在生成中间码之间,要设计好一个运行内存模型。这里直接就用数组来代替内存空间。1.内存class Memory{public: Memory() { //初始化内存 memory = new char[8192]; } //生成中间代码用的地址分配计数器 int address = 0; //内存空间 int esp=0; int ebp = 0; int malloc(int size) { return address+=size; } cha

2020-05-17 18:45:24 232

原创 学习光线追踪(0)---准备工作

0.介绍其实想晚一点写一篇相关博客,与大家分享一下最近学习的光线追踪,但是VS2019不太给力,出了BUG,这导致我之前写的代码丢了一部分,本打算是整理好一遍发的,这回正好,边整理边发吧。1.准备工作首先说明,我不是专门研究光线追踪的,只是觉得这个挺有意思,或者说效果挺让人震撼的,这不禁让我对其有了兴趣,然后就阅读了一些相关材料,之后就一发不可收拾。后面的例程都是基于C++开发,图...

2020-05-17 15:48:24 332 1

原创 学习光线追踪(1)---环境配置

0.简介本着轻量级的目的,也是轻便的目的,所以环境我并没有用太多额外的东西,主要是两部分,一个是显示输出,一个是线性代数计算。1.GLM库这个在OpenGL编程中用的多一些,主要是矩阵向量计算的库,也不用编译,下载来配置好包含目录直接用。2.OpenCV这个用来显示图像,用这个原因是我电脑里正好有这个,并且配置简单,所以就用其作为显示输出,有点大才小用了。3.C...

2020-05-17 15:48:17 494

原创 学习光线追踪(2)---光线

0.简介光线追踪中,计算的是光线,我们这次设计一个光线类。1.光线类光线中,包含了几种属性,方向,出发点,颜色,强度,还有一个获取光线打到的点的函数。class Ray{public: //光线起点 vec3 position; //光线方向 vec3 direction; //光线颜色 vec3 color; //光的强度 float intensity;...

2020-05-17 15:48:10 423

原创 学习光线追踪(3)---相机

0.简介相机应该都用过吧,手机上面有,数码相机什么的,原理是相机里面有接收光线的元件,就是感光元件,然后将光信号转换成电信号,之后就变成了我们拍摄出来的图像,这里我们来模拟一个相机,只不过我们的相机不是像真实的那样接收光线,而是要从相机发出光线,之后,根据相机发出的光线,追随着这些光线,找到光线能打到的无物体,然后再继续追踪反射,折射的光线,最后将本来是最终打到相机上的一束光线逆向的找到的来的...

2020-05-17 15:48:02 873 1

原创 学习光线追踪(4)---多边形

0.简介我们要建立一些多边形,球形比较好画,所以就先设计一个球的类。1.多边形基类以后还会有其他形状,所以,先设计一个多边形基类。class Polygon{public: //位置 vec3 position; //世界坐标矩阵 mat3 transforms; Polygon(); ~Polygon();};后面这个类还会有比较多的改动,这里先放两个重要...

2020-05-17 15:47:54 369

原创 学习光线追踪(6)---第一次显示

0.简介前面做了那么多准备,我们有了相机类模拟相机,有了球类,有了光线类模拟光线,现在就用这些东西来显示一下,算是一次调试。1.效果先来一张效果图。深度显示2.解析这次主要是将之前写过的功能整合了一下,并且对之前的类做了一些小修改。光线类中添加了一下东西。class Ray{public: //光线出发点 void* polygon = nullptr;...

2020-05-17 15:47:47 449

原创 学习光线追踪(7)---材质采样

0.简介前面可以显示出效果,这里我们将材质功能用上,让显示的物体具有更加真实的效果。1.光照模型光照模型一般比较常见的是phong模型,在这里涉及的光照效果更多,所以我们就分析一下我们自己的光照模型。先用一个比较简单的模型,就是物体自身就发光。Ray Polygon::sample(Ray out, Ray reflact, Ray refract){ Ray res(o...

2020-05-17 15:47:36 397

原创 学习光线追踪(8)---材质反射

0.简介这次实现以下反射效果,这里开始就涉及光线追踪原理了。1.反射光线反射,要经过多个物体反射,这里我们使用光线追踪方法,追踪折射光线。Ray rayTrac(Ray ray,vector<Polygon*> s,int times){ Ray r(vec3(0,0,0),vec3(0,0,0),0,vec3(0,0,0),nullptr); if (time...

2020-05-17 15:47:28 624

原创 学习光线追踪(9)---平面

0.简介之前绘制的都是球体,现在我们来尝试绘制平面。1.平面平面表示方式有不少,这里用点法式,一个法向量和一个顶点。class Plane : public Polygon{public: Plane(); Plane(vec3 _normal, float _normal_distance, Material _m) :normal(_normal), normal_d...

2020-05-17 15:47:16 476

原创 学习光线追踪(10)---三角形

0.简介在OpenGL或者D3D中,都有一个最基本的图元,就是三角形,三角形可以组成任意形状,并且计算起来也容易,为了能让我们绘制出更多的形状,这次来实现一个三角形类。1.三角形判断三角形在空间中形成了一个平面,所以,三角形一定在某个平面上,所以先判断光线是否能打到扫三角形所在平面,如果光线打到了三角形所在平面,那么再计算打在平面上的点是否在三角形内。判断光线是否打在平面上已经在上一节...

2020-05-17 15:47:08 785

原创 学习光线追踪(11)---纹理加载

0.简介之前显示的图形中都是单一颜色的,这次我将纹理加上去,这样就可以显示更加丰富的元素了。1.纹理添加纹理功能需要对源程序多个地方修改,因为有了纹理就会增加纹理坐标的处理,所以在定义多边形的时候,就要在在原来顶点的基础上添加纹理坐标。然后根据光打在多边形上的位置,计算纹理坐标。2.纹理坐标定位为了能刚好的兼容各种i情况的纹理坐标,采用面积法来定位纹理坐标。纹理坐标示意图...

2020-05-17 15:46:39 505 2

原创 学习光线追踪(12)---画一面墙

0.简介最近事情很多,这算是才有些空写写,先拿一个简单的缓一缓,不然之前写的都快忘了。上次画出了三角形,又添加了纹理,这次画一个墙面做背景。1.墙面一面墙就是一个矩形平面,两个三角形拼接起来就可以了,但是三角形一个一个的声明比较麻烦,所以就新建一个类,专门绘制这种多个三角形组合。class Triangles : public Polygon{ vector<Trian...

2020-05-17 15:46:32 404

原创 学习光线追踪(14)---法线纹理

0.简介如果想让上一次的墙面更加真实一些,就需要法线纹理来修饰一下了。1.法线纹理我这里简单介绍一下法线纹理,模型表变的法向量一般都比较单一,例如上一篇博客里的墙面,法向量都是朝向一面的,这就带来一个问题,墙面就很假,很光滑,跟瓷砖一样的感觉,但是实际的墙面并不是,而其根本原因就是表面的法向量导致光的反射方向一样,所以才像瓷砖一样反光,如果表面的法向量是接近于真实的,效果就会好很多,那...

2020-05-17 15:46:23 385

原创 学习光线追踪(13)---改进一下三角形碰撞光线的算法

0.简介之前绘制了一面墙之后,发现墙的斜对角有缝隙,找到了原因后,更换了其算法。这里借鉴下面这篇博客中介绍的随后一种方法。参考文章具体原理就不在重复了。1.修改为了方便对比,我把原来的算法和新的算法都整理成了一个新的函数,这样编码也规则很多。光线碰撞代码做了一些修改,将判断点在三角形内部换成了一个函数,而不是原来的一堆代码.Ray Triangle::intersec...

2020-05-17 15:46:13 728

原创 学习光线追踪(15)---并发计算

0.简介该来的总会来,随着场景中的物体数目增加,光线反射的复杂程度增加,计算时间就成了问题,一张4096x4096的图像生成要好几十分钟,这要是在以后加入折射计算,随机漫反射等估计是看不到结果了。1.初步并发修改并发处理,可以适当加速,我在主函数中做了如下修改。这是原来的。 for (int i = 0; i < img.rows; i++) { for (int...

2020-05-17 15:45:52 320

原创 学习光线追踪(16)---折射计算[1]

0.简介前面的反射效果已经和非光追渲染有很大区别了,这回加上折射计算,效果会更好。1.折射计算折射计算相对反射要复杂一点,折射公式网上有的是,我就不在这里进行推导和详细讲解了,有需要的可以看下面这篇博客。光线折射计算2.添加计算代码在之前的反射光线附近添加折射光线计算代码,然后折射也进行光追迭代。光线追踪迭代函数。Ray rayTrac(Ray ray, vect...

2020-05-17 15:45:42 1438

原创 学习光线追踪(16)---折射计算[2]

0.简介上一次实现了折射,看到了一个透明的球体,这次也是一次展示,放入了一个玻璃方块,就是一块玻璃砖。1.效果不在过多叙述就是添加了一个新的透明盒子折射效果可以看到地面上有一个透明的立方体。三角面是逆时针绘制的。2.源码release0.12...

2020-05-17 15:45:29 472

原创 学习光线追踪(17)---BUG修改

0.简介之前就顾着一直写来着,中途出现了一些小问题,这里简单总结一下。1.盒体绘制这里后来我绘制了一个箱子,结果出现了神奇的问题,找了很久发现,是在计算箱子最近平面的时候找到平面就返回了,没有判断最小距离。所以做了新的补丁。Ray Triangles::intersect(Ray ray){ //一束光线只能在同一时间打在这个物体的一个位置上 float min = FLT...

2020-05-17 15:45:13 459

原创 学习光线追踪(18)---镜面反射贴图

0.简介前面我们实现的镜面反射都是统一的反射指数,但是对于有些材质就不适合有太强的反光效果,通过镜面反射纹理来实现不同部位的反射效果不同1.添加纹理这里和纹理的使用差不多,将原来的参数替换成图片,这里的图片应该是一张灰度图如下图。箱子的反射贴图这个是木箱子的反射贴图,黑色的部分是不发生镜面反光的,白色部分是有镜面反光的。float HighMaterial::getSp...

2020-05-17 15:44:56 1613

原创 学习光线追踪(19)---光源[1]

0.简介目前我们的程序能模拟一些反射和折射的效果,但是,目前物体可见主要还是由于物体自身发光,也就是材质的light属性不为0,从这里开始,要彻底的实现光源发光,其余物体依靠光源的光反射光线的方法显示。注:贴出源码与最终源码可能有所不同,以最终源码为准。1.光源定义一个光源很简单,就是将光源材质的light设置一个大于0的数字,这就是光源,其余的等于0的都是非光源。2.阴影...

2020-05-17 15:44:42 766

原创 学习光线追踪(19)---光源[2]

0.简介上次解决了光源问题,下面我们解决透明物体透光问题。注:贴出源码与最终源码可能有所不同,以最终源码为准。1.透明物体透明物体受到光照,比较直直观的就是透镜效果,放大镜聚焦这类的,我是这么考虑的,透明物体也相当于一种光源,只是这种光源和真正的光源不同,真正的光源发光点就是某个中心点,例如球形光源就是球的中心,但是透镜不是,透镜是透镜上所有点都有发光的可能,因为透镜"发"出的光是...

2020-05-17 15:43:56 530 1

原创 学习光线追踪(19)---光源[3]

0.简介目前,还有个问题没有解决,就是在场景中,所有光线的反射折射都对其余物体有影响,这些影响可以考虑处理。1.反射折射比如一个光源照到了镜面反射物体,那么此时镜面反射物体就相当于一个光源,再次对其余物体反射光线,此时,这类反射物体就可以被认为是一个光源,透镜并不只是对光源方向产生折射效果,对任何方向都有,只是因为有光照一面光线强,导致阴影产生,别的方向没有强光源,所以看不出来有阴影效...

2020-05-17 15:43:39 548

原创 学习光线追踪(5)---材质

0.简介材质,这里我不会讲的和教科书上的一样,所以也不要把我接下来要说的东西当作正确的,或者是标准的,因为这是我自己设计的,可能会有缺陷。1.材质参数材质一般会影响物体表面的反光,颜色,折射等。那么就将反光系数(正反光参数,漫反射参数),折射率,折射衰减,漫反射衰减,透光度,自发光参数,作为材质参数,自身颜色。class Material{public: //折射率,控制折...

2020-05-17 15:42:43 539

原创 自制编程语言(9)---语法分析---函数声明

0.简介前面写了那么多,现在我们可以支持函数声明了。1.函数声明//声明1int fun(int a,int b){ ...}//声明2int fun(int a,int b);int fun(int a,int b){ ...}我打算支持这两种声明格式。先设计函数表达式类//代码块表达式class CodeBlockStatement : public Statement{public: CodeBlockStatement(int _l

2020-05-12 18:21:53 322

原创 自制编程语言(8)---语法分析---数组赋值

0.简介数组也和变量一样,需要有直接赋值操作。1.数组赋值其语法如下int a[3]={1,2,3};这里主要对大括号里的内容进行处理,至于个数要到后面就解析的时候处理。2.实现//数组声明语句class ArrayDeclareStatement :public Statement{public: ArrayDeclareStatement(int _line, int _column) :Statement(_line, _column) {} //数组类型

2020-05-12 01:11:07 322

原创 自制编程语言(7)---语法分析---变量声明赋值

0.简介前面有了变量声明,我希望还能支持变量声明后直接赋值的操作。1.声明赋值其语法样式如下int a = 10;2.语法实现//变量声明语句class VariableDeclareStatement : public Statement{public: VariableDeclareStatement(int _line, int _column) :Statement(_line, _column) {} //类型 Token type; //类型名字 st

2020-05-11 21:32:51 351

原创 自制编程语言(6)---语法分析---分号

0.简介习惯了C语言和C++编程,一句话结尾没有分号觉得很别扭,所以这里同样也实现分号结尾。1.合格的分号语法;int a;int a;;以上都是正确的分号。2.实现首先设置一个 专门检测分号的函数void Parser::semicolon(){ //检查是否为分号 if (getToken() == TK_SEM) { //吃掉分号 while(getToken() == TK_SEM) pushNextToken(); } else {

2020-05-11 20:35:46 323

原创 自制编程语言(5)---语法分析---报错处理

0.简介今天比较累,所以就写点简单的。1.报错当我们的代码出现错误的时候,编译器应该能识别到并且可以反馈给我们,我们需要在语法分析或者是词法分析的一些指定位置安插一些报错语句,当遇到了错误,然后返回错误信息,这样我们就能根据错误信息来修改代码。2.错误类型根据目前编译器所有的功能,有以下几个地方可以识别出错误数组缺少中括号数组声明的下标不是确定的数字表达式语句无效声明标识符错误设计一个类,专门负责错误输出。//错误代码enum ErrID{ MISSING

2020-05-10 23:46:32 817

原创 自制编程语言(4)---语法分析---数组声明和访问

0.简介数组我觉得不太好管理,所以先把这个问题解决掉。1.数组声明数组声明语法如下。int a[10]其中包含类型、数组名、元素个数新建一个数组声明语句//数组声明语句class ArrayDeclareStatement :public Statement{public: ArrayDeclareStatement(int _line, int _column) :Statement(_line, _column) {} //数组类型 Token type;

2020-05-09 23:27:50 343

原创 自制编程语言(3)---语法分析---赋值语句

0.简介本次实现赋值语句。1.赋值语句a = a + ba = 9以上语句均为赋值语句,这里引入了许多表达式分析。2.一元表达式先从一元表达式开始。std::shared_ptr<Expression> Parser::parseUnaryExpr(){ //什么情况下是一元表达式 Token token = getToken(); //有符号前缀的情况下 if (token == TK_MINUS || token == TK_LOGNOT || t

2020-05-09 19:29:20 1142

原创 自制编程语言(2)---语法分析---变量声明语句

0.简介先从比较简单的语法解析开始,CScript打算设计成强类型语言,所以所有变量都要先声明才可以使用。1.声明语句增添了AST树class AstNode{public: int line, column; AstNode() {}; AstNode(int _line, int _column) :line(_line), column(_column) {} //分析语法后生成中间码 virtual operand evaluation(std::vector<

2020-05-09 15:47:40 917

opencv4.4-win-gcc-x64

这是一个在windows下GCC编译的64位opencv4.4库,在win下GCC编译器中可以方便使用

2020-11-09

C++17 ISO.zip

C++17的官方文档,对于全面了解C++很有帮助,英文版,虽然很少有人把这东西全看完,但是看一看可以的。

2020-07-02

jpeg_DCT_matlab.rar

这个用matlab写的一个离散余弦变换的代码,是了解jpeg压缩原理的过程,可以参考学习,代码只适合学习

2020-03-03

raytrac0.01.zip

我的博客中附属的代码,光线追踪相关的C++代码,原本是0积分的,如果积分变了请及时给我留言,我会换平台上传。

2019-12-26

遗传算法C++.rar

写的一段遗传算法演示,能通过彩色点生成图像,需要opencv环境

2019-10-30

minix3.2.1的源码

直接从系统minix3文件夹下打包出来的源码,可以学习,源码包比较大,可能还包含别的东西。

2019-01-03

XV6操作系统源码

xv6操作系统源码,需要的可以下载来学习,资源真的很好。

2018-12-17

sdr-sharp软件

分享一个SDRsharp,喜欢RTL-SDR的朋友可以来下载软件,

2018-11-21

OSG的书籍,三维渲染引擎编程指南,肖鹏等

这是一本关于OSG的书籍,书里的内容比较全面,可以参照里面学习

2018-11-21

opengl需要的几个库的源码

这里面包含了glew,glfw,glm,soil的源码,可以自己下载编译。

2018-11-21

vs2017+win10下编译的opengl需要用的库,下载后直接配置vs环境即可

编译好的库文件,在win10下可以直接使用。下载的小伙伴要看好需要的环境173363.55

2018-11-21

cyclone-3D物理引擎源码

这是一本书的物理引擎的源码,有书但是没有源码的小伙伴可以使用,源码写的很好,值得学习

2018-11-07

opencv3.x相机标定代码

做实验的时候写的代码,顺便上传来,有需要的可以下载,可能需要修改,可供参考。

2018-11-07

计算机视觉特征提取与图像处理(第二版)

一本关于图像特征提取的书籍。是汉语版的,里面的内容不错。

2018-03-06

英文版的关于写操作系统的书籍

这本书是英文版的,但是写的不错,跟着做可以写出一个简单的系统,书的篇幅不大,言简意赅

2018-02-09

现代编译原理C语言

这是一个编译原理的教程,简介明了,特别好,推荐大家去看

2018-02-09

空空如也

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

TA关注的人

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