- 博客(16)
- 收藏
- 关注
原创 设计模式实现CPP——单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。常用于共享资源(如配置信息、线程池、数据库连接等),保证全局一致性。
2025-03-11 21:15:42
404
原创 设计模式实现CPP——MVC模式
MVC即,MVC的核心思想是,提升代码的可维护性和扩展性。三者职责如下:1、:管理数据和业务逻辑2、:负责界面展示和数据呈现3、:接收用户输入,协调Model和View的交互。
2025-03-10 18:37:27
240
原创 设计模式实现CPP——策略模式
1、动态切换算法:客户端通过 setStrategy 方法动态更换策略。2、解耦策略与使用:上下文类不依赖具体策略的实现,只依赖接口。3、扩展性:新增策略只需添加新的 TravelStrategy 子类,无需修改现有代码。4、内存管理:示例中使用原始指针简化逻辑,实际项目中建议使用智能指针(如 std::unique_ptr)。
2025-03-10 16:09:09
328
原创 设计模式实现CPP——观察者模式
在被观察者的虚基类中需要声明三个虚函数,分别完成添加、删除和通知观察者的功能,观察者的虚基类中声明一个虚函数,完成更新的功能。随后具体的被观察者和观察者分别继承自两个虚基类,并重写其中的虚函数完成特定的功能。的关系,由两部分组成,分别是被观察者(一)和观察者(多),具体实现的功能为,被观察者中状态发生改变时,通知其管理的所有观察者做出相应的改变。首先需要被观察者和观察者分别有一个。2、被观察者虚基类(Subject)3、观察者示例(显示设备)4、被观察者示例(气象站)其组织结构大致如下所示。
2025-03-03 20:22:27
305
原创 C++之哈希表
当我们需要查询一个数在某数据结构中是否存在或者值为多少时,如何才能达到O(1)的复杂度呢,比如对于vector或链表类型,我们需要遍历,时间复杂度为O(n),对于红黑树,时间复杂度为O(logn),为了达到O(1)的时间复杂度,自然需要一种新的数据结构,这就是哈希表了。但是上述方法存在一个缺陷,那就是当我们只需要存储少数数字,而这些数字之间的差很大时,意味着我们得维护一个巨大size的数组,但只用了很少一部分,浪费了大量的内存空间。,那么后面要查找、修改value的值就很简单了,O(1)复杂度即可。
2025-03-03 14:27:03
912
原创 C++之构造函数
从实现的功能来看,似乎二者是一样的,都是将另一个对象的值赋给了新的对象,确实如此。默认构造函数和初始化构造函数比较简单,不再赘述,转换构造函数和委托构造函数用的不多,也不过多介绍,感兴趣可自行查阅。6、转换构造函数(只接收一个参数,可进行隐式类型转换,若加explict修饰,则不能进行隐式类型转换,需要显式的指定)而移动构造则不分配新的内存区域,也不进行复制,他将s1的资源(通常是指针),他将左值转换为右值,这是由于移动构造只接受右值引用为参数。4、移动构造函数(参数为另一个同类型对象的右值引用)
2025-03-02 20:41:51
831
原创 C++之匿名表达式
捕获列表允许lambda表达式在函数体内使用捕获列表中的变量,通常是lambda表达式的父作用域中的变量。当我们需要在某处实现一个逻辑简单的功能,并且复用性不高时,就可以使用lambda表达式,而不必定义一个普通函数,省去了函数定义这一步,比如,想对。参数列表和普通函数基本一样,区别是如果lambda表达式不需要传递参数,参数列表可以省去不写,但如果写了。已经被抛弃不再使用,返回类型也可以由编译器自动推导,不必写,函数体和普通函数一样,不再赘述。[]有两种捕获方式,分别是按值捕获和按引用捕获,
2025-03-02 16:35:15
273
原创 图论算法简单总结(C++)
本篇内容来源于代码随想录。最小生成树是所有节点的最小连通子图,即:以最小的成本(边的权值)将图中所有节点链接到一起。给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。拓扑排序也是图论中判断有向无环图的常用方法。
2025-01-21 18:22:51
1298
原创 LearnOpenGL—camera类封装实现
键盘WSADQE控制摄像机的上下前后左右移动,只改变camera的Position的值,并且一个键只改变一个分量的值(如WS只影响Position.z,AD只影响Position.x,QE只影响Position.y),因此,可定义三个向量代表相机坐标系下x轴、y轴、z轴上的三个正方向,位移的距离取决于位移的速度和按键按下的时间,因此确定成员属性如下所示。其中,摄像机的目标位置可以center = Position + Front,因此,代码可改为。在此阶段确定三个成员属性如下。
2024-11-22 16:14:06
578
原创 计算机图形学06 光线追踪(Ray Tracing)
前面学习的光栅化(Rasterization)是渲染图像的一种方法,光线追踪(Ray Tracing)则是区别于光栅化的另一种图像渲染方法。那么,为什么完美需要光线追踪呢?原因有以下三点:1、光栅化渲染的阴影是硬阴影,效果不好;2、对于Glossy reflection,光栅化渲染出的效果不好;3、对于间接光照(光线经历多次弹射),光栅化同样得不到好的效果。而光线追踪则可以完成以上三点。Radiant Intensity定义为单位立体角上的,如下所示。
2024-10-29 16:06:22
3073
原创 计算机图像学05 几何
经过了之前的学习,我们能够表现直线、平面,接下来的几何部分,就是关于如何表示曲线、曲面的部分,首先,几何有两种表示方法,一种的隐式表示,一种是显式表示,类似于数学中的隐函数与显函数的关系,隐式表示虽然无法精确的获得每一个点的对应关系,但通常对于判断某一给定的点是否在曲线上或曲面上(内外)十分方便,显示表示则是直接用方程表示了每一个点的映射关系,但对于判断某点是否在曲线上或曲面上有时十分困难。因此,具体使用哪种表示方法需要根据现实情况决定。
2024-10-21 23:15:49
925
原创 计算机图形学04 着色(shading)
对于三角形ABC,已知其三个顶点坐标,那么对于三角形内部的任意一点,都可以由三角形三个顶点的线性组合表示,且满足以下关系,则αβγ(α,β,γ)αβγ称为该点的中心坐标。重心坐标的计算方法如下所示经过光栅化过后,我们已经将图像对应到了屏幕上的每一个像素,接下来就是为每一个像素赋值的过程,这就是着色(shading)。读了上面的内容,可以发现对于Blinn-Phong反射模型,我们已经知道了lllnnnvvv是什么,但是并不知道k_d是什么,这就是接下来要讲的东西,纹理图。
2024-10-16 19:42:40
1564
原创 计算机图形学03 光栅化
经过前面的MVP变换,我们得到了一个宽高均为2,中心在坐标原点的cube,光栅化就是把这个cube绘制在屏幕上的过程。他需要经历两个阶段,分别是视口变换(Viewpoint Transformation)和光栅化(Rasterization)。
2024-10-07 21:08:52
1885
2
原创 计算机图形学02 MVP变换
对于二维投影来说,直接把Z轴坐标舍弃,就能得到物体在xy平面上的投影。1、先将下图所示左边的frustum挤压成右边所示的cuboid。要把得到的图像平移并且缩放到[-1,1]²中,方便之后的计算。包括对物体的旋转、平移等,变换矩阵即为对应操作的组合。设第一步的变换矩阵为M1,则M1的推导过程为。1、找个好地方摆pose(Model变换)因为R为正交矩阵,所以R的逆等于R的转置。目的:将空间中的三维物体变换投影到二维。3、按快门(Projection变换)2、把相机放个好角度(View变换)
2024-10-07 16:47:01
587
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅