自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(149)
  • 问答 (5)
  • 收藏
  • 关注

原创 光栅化补缺

如果X在三角形内部,AB×AX、BC×BX、CA×CX应该同号(都是向量叉乘),反之则X不在三角形内部。光栅化的采样可以看做是时域信息与冲激函数的乘积,而时域的相乘等于频域的卷积,如下图所示。所以对图像进行模糊,去除一些高频信号后再采样就有可能起到反走样的效果。假设现在需要判断的点为X,三角线顶点依据顺时针顺序分别为ABC,则。而走样现象就是频域卷积后,高频信息的混叠。

2023-03-25 21:26:34 168 1

原创 C++/C#类型大小汇总

类型sbyte(c#)byte(c#)shortushortintuintlongulong。

2023-03-23 22:26:44 709

原创 龙格-库塔法(Runge-Kutta methods)

龙格库塔法简单介绍

2022-11-25 18:16:57 6204

原创 波的相关参数概念整理

介绍水波的相关概念参数

2022-11-16 20:34:37 3080

原创 unity 位移贴图正弦波面

本文的目标是制作一个虽时间波动的正弦波面,效果如下图首先在unity中创建一个平面,这没什么可说的。

2022-10-19 21:58:25 1165

原创 c++ String

首先,c++中可以使用c风格的字符串,即字符数组,它有以下几种函数可以使用除此以外,c++中也有string类,下面介绍几种它的常用方法。

2022-10-08 20:34:31 187

原创 划分为k个相等的子集

首先我们可以知道有两种情况一定是false的,一种是整个数组的总和不能被k整除,还有一种是数组中的最大值大于均分后的平均值。我们以上图的数组为例,第一步先从最大且没被使用的数i开始, 求出i与sum的差值。其次我们先将数组排序,并且建立一个用来标记每个元素是否已经被使用的bool数组。接下来就是最重要的回溯算法了。设均分后的每组之和为sum。

2022-09-20 20:36:46 206

原创 扫描线+离散化 计算矩形面积

我们给出了一个(轴对齐的)二维矩形列表 rectangles。对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标, (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。计算平面中所有 rectangles 所覆盖的 总面积。任何被两个或多个矩形覆盖的区域应只计算 一次。返回 总面积。因为答案可能太大,返回 10^9 + 7 的 模。i。

2022-09-17 22:11:15 313

原创 最长同值路径

给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值。将左节点的函数返回值记为l,右节点记为r。另设l0和r0表示包含当前节点的路径长度,初始化为0,若当前节点与左节点值相同则l0=l+1,否则仍保持为0,右节点同理。,以图中的根节点为例,它返回的是0,因为左右节点都不是1。若输入4,则返回1,因为向左或右的路径都是1,注意左右的路径虽然可以相连,但它不是递归函数要返回的值。以最高的4节点为例,最长路径是左右相加,所以当l0+r0大于res时更新res。

2022-09-02 21:42:23 214

原创 下一个排列

整数数组的下一个排列是指其整数的下一个字典序更大的排列。例如,arr=[1,2,3],以下这些都可以视作arr的排列[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。而arr=[3,2,1]的下一个排列是[1,2,3],因为[3,2,1]不存在一个字典序更大的排列。类似地,arr=[2,3,1]的下一个排列是[3,1,2]。例如,arr=[1,2,3]的下一个排列是[1,3,2]。...

2022-07-31 21:37:12 65

原创 常见渲染管线整理

最常见的渲染,所谓的前向渲染,就是将物件串成一个队列,一个接一个的进行渲染。可以以光源为主循环也可以物体为主循环。缺点是当物体或光源较多时效率低下,且会有比较多的重复计算。将渲染分为两个阶段,第一阶段处理光照计算需要的数据,并将他们储存到GBuffer中,这些数据包括片元位置、漫反射贴图,法线贴图,镜面反射强度图等。其优点是物体和光源较多时效率高,缺点是需要的带宽较大,不适用MSAA,难以处理透明混合。由于带宽限制,移动端很难实现常规的延迟渲染,一种解决办法是将屏幕划分为多个区域,分别进行渲染。将屏幕空间划

2022-06-08 16:25:26 352

原创 管线中的坐标变换

1

2022-06-07 21:40:47 180

原创 反走样/抗锯齿技术

走样的根本原因,是用离散的像素点无法正确表达连续的几何体,导致边缘的像素不平滑。不过当像素越多分辨率越高时,走样现象就越不明显。所以反走样的第一种办法就是在渲染计算时使用更高的分辨率,这种方法被称为超采样抗锯齿(Super Sample Anti-aliasing, SSAA),但是这种方法显然性能开销很大。如左图所示,通常判断一个点是否属于某个三角面片,是根据像素中心点是否被遮盖,这个中心点也被称为采样点。增加采样点的个数,并根据被覆盖的采样点个数对颜色进行平均,如右图所示,这就是MSAA方法。MSAA要

2022-06-07 20:51:28 454

原创 四元数简介

图形学中的旋转主要分两种:欧拉旋转和轴角式旋转。欧拉曾经证明过,任何旋转都可以表示为物体绕自身三轴的旋转。所以欧拉旋转就是物体以特定的顺序,依次绕自身的三轴进行的旋转。但是这种旋转在绕第二个轴旋转90°时会失去一个自由度,导致万向节锁的现象。轴角式,顾名思义是绕某个特定轴旋转某个角度,通过四元数和Rodriguez公式都可以表示这一旋转过程。复数可以表示为a+bi,其中i²=-1,而复数的相乘与矩阵相乘可以看做是等价的。四元数与复数相似但不是复数。四元数的定义a+bi+cj+dk,其中i²=j²=k²=ij

2022-06-07 19:49:15 457

原创 不简单的简单题 DP之最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。这道题的做法是动态规划,从第二个元素遍历数组,若前一个元素大于0,则将它与当前元素的和放在当前位置上,这样一来每个位置上存储的就是目前当前元素参与其中的最大子数组之和,遍历结束后再找出其中的最大值即可。public class Solution { public int MaxSubArray(int[] nums) { if(num

2022-04-18 21:58:02 122

原创 C# Lambda表达式简单介绍

Lambda表达式可以看做是一种快捷的定义函数或委托的方式,它有以下两种形式:(input-parameters) => expression(input-parameters) => { <sequence-of-statements> }下面举两个例子Func<int, int> square = x => x * x;Console.WriteLine(square(5));// Output:// 25Action<str

2022-04-18 17:31:45 430

原创 C#访问修饰符

C#中的访问修饰符有以下六种:public:同一程序集和和引用该程序集的所有代码都可访问。public成员可访问级别由该类型本身的级别决定。 private:只有同一类中的成员可以访问 protected:同一类和派生类中的代码可以访问 internal:同一程序集中的代码可以访问。 protected internal:同一程序集或不同程序集中的派生类可以访问。 private protected:同一程序集中的派生类可以访问。其中常用的主要是前四种,下面是微软docs的一个对照表

2022-04-18 15:37:29 2825

原创 unity GC机制简单介绍

GC全称是garbage collection,即垃圾回收,顾名思义就是一种释放内存垃圾的机制。这种机制主要作用在堆空间上。堆上的变量在存储的时候,主要分为以下几步:1)首先,unity检测是否有足够的闲置内存单元用来存储数据,如果有,则分配对应大小的内存单元;2)如果没有足够的存储单元,unity会触发垃圾回收来释放不再被使用的堆内存。这步操作是一步缓慢的操作,如果垃圾回收后有足够大小的内存单元,则进行内存分配。3)如果垃圾回收后并没有足够的内存单元,则unity会扩展堆内存的大小,这步操

2022-04-17 22:18:17 8485 1

原创 C#控制台输入输出

控制台标准的输入输出的方法主要有以下几个Console.WriteLine() Console.Write() Console.ReadLine() Console.Read() Console.ReadKey()前两个是输出,区别在于第一个自带一个换行符,第二个没有,比较简单没什么好多说的。第三个和第四个是输入。ReadLine()这个方法的返回值是一个字符串,所以除了字符串类型的变量,其他的都不能要接受它的输入都必须通过类型转换,下面以int值举例,其他类型同理int x = i

2022-04-16 21:05:38 10779

原创 图的拓扑排序--Khan算法

大家在上大学的时候,应该都遇到过这样的情况,有些高级的课程需要你先完成基础课程后才可以学习。在「图11. 课程关系图」中,如果你想选课程 C,那你需要先完成课程 B,如果你想选课程 B,那么你需要先完成课程 A。此时,就需要「拓扑排序」的帮忙了。「拓扑排序」针对的是 有向无环图 的一种算法。它是对「图」中所有顶点按照先后顺序的一种线性排序。换句话说,在如果存在顶点 u 和顶点 v,要想到达顶点 v,则必须要到达顶点 u 。那么在「拓扑排序」中,顶点 u 必须处于顶点 v 的前面。Khan算法的步骤如

2022-04-14 20:26:53 480

原创 加权图的单源最短路径

Dijkstra 算法dijkstra算法是一种贪心算法,它只能使用在没有负权值的加权图中。它的步骤如下创建一个记录当前最短路径的数组near和一个标记某点是否已在最短路径中的数组isGone,如果需要找出最短路径经过了哪些点,则还需要创建一个用来记录最短路径中上一个节点的数组last。 将near全部值设为一个无穷大,isGone全部设为false,将出发点的near设为0 找到当前near中最小且对应isgone为false(未加入最短路径)的点x 遍历与它直接相连且isGone为fals

2022-04-11 17:03:45 1416

原创 最小生成树算法

生成树 指的是「无向图」中,具有该图的 全部顶点 且 边数最少 的连通子图。最小生成树指的是「加权无向图」中总权重最小的生成树。连接所有点的最小费用给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单

2022-04-10 19:51:30 1631

原创 图的DFB与BFS

图的DFS与BFS和二叉树原理是一样的,不过在保存遍历序列的时候要注意,一般C#中用List来保存序列,而List是引用类型。DFS主要是利用递归的方式,不同问题中递归的结束的条件可能有所不同。BFS采用队列的方式,不过队列的类型不一定是节点,也可能是List,即序列,比如需要求某两点之间的路径的时候。所有可能的路径给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) 。graph[i] 是一个从节点 i 可以访问的所有节点

2022-04-08 17:05:53 493

原创 并查集问题

并查集问题指的是告诉你许多组两点之间的连接状态,要求某两点是否相连或者求有多少个连通图。这种问题的求解是比较模板化的,关键在于建立find函数和union函数。find函数的主要作用是找到一个节点的根节点,union函数的作用是将某两个点的根节点相连。主要的解题步骤如下:建立一个长度等于节点数的root数组和rank数组,root[i]=i,rank[i]=1. 创建一个递归find函数,当x==root[x]时返回x,否则就root[x]=find(root[x]),同时改变rank数组ra

2022-04-08 15:47:00 477

原创 时间复杂度 O(n) 级排序算法

《算法导论》定理 8.1:在最坏情况下,任何比较排序算法都需要做 O(nlogn) 次比较。《算法导论》推论 8.2:堆排序和归并排序都是渐进最优的比较排序算法。所以时间复杂度 O(n) 级排序算法都是不进行比较的算法而通过元素本身的特性进行排序的算法,因此都有一定的限制,并不是在所有情况都能使用,主要的有:计数排序,基数排序和桶排序。计数排序计数排序需要提前知道所有元素的取值范围,比如【0,10】,依据这个范围建立一个数组t[11],并将其全部初始化为0,接下来遍历需要排序的数组,假设遍历

2022-04-06 21:06:56 3772

原创 时间复杂度O(nlogn)的排序算法

时间复杂度O(nlogn)的排序算法有四种,分别是希尔排序,堆排序,快速排序和归并排序。这四个排序都非常重要。希尔排序希尔排序本质上是插入排序的优化,先对间隔较大的元素进行插入排序,完成宏观调控,然后逐步缩小间隔,最后一轮一定是间隔为 1 的排序,也就是插入排序。间隔在希尔排序中被称为「增量」,增量序列不同,希尔排序的效率也不同。堆排序堆排序的关键在于建堆,堆分为大顶堆和小顶堆,大顶堆中最大的元素在堆顶,小顶堆同理。堆实际上是一颗完全二叉树,不过为了方便我们把它用数组的形式储存,储存的顺

2022-04-05 22:57:39 10004

原创 二叉搜索树用法及例题

二叉搜索树定义就是每个节点的左子节点值比它小,右子节点值比他大,也就是说它的中序序列是按顺序排列的。它的最大特点是可以比较快地插入和删除节点而保持排序,由于这个特点就可以用它存储一些需要多次插入或删除元素并保持顺序的集合。显然在二叉搜索树中查找一个元素是很容易的,插入元素也一样,而删除元素要相对难一些。删除二叉搜索树中的节点首先当然是搜索这个结点,不妨假设这个结点就是根节点。假如此时根节点的任一子节点为空,只要不空的子节点作为新的根节点就行了。假如两子树都不为空,新的根节点可以来

2022-03-29 16:21:42 1885

原创 C#哈希表经典例题

哈希表是用来储存键值(key/value)对的数据结构,它有以下属性与方法通过键做索引可以得到值,如hash[key]=value哈希表不能在声明时指定类型,所以调用其中的值必须进行强制转换。哈希表常用的场景,一是当字符等数据重复多次出现,并且需要记录次数的时候,二是存在关联或者成对的数据需要调用时,比如人名和学号。寻找重复的子树给定一棵二叉树root,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。...

2022-03-27 17:30:47 1126

原创 队列与BFS的常见做法

广度优先搜索(BFS)的一个常见应用是找出从根结点到目标结点的最短路径。队列非常适合用来处理标准的BFS。以计算最短路径为例,BFS通常有以下步骤:创建一个合适大小的bool数组或哈希表来记录节点是否被遍历过,初始时将所有所有位置置为false; 创建队列,注意队列的数据类型 确定起点,并将起点入队,将起点对应位置置为true,路径长度level=1 当队列不为空时并且没有到达终点时循环以下步骤 将当前队列长度记为count,出队所有count个元素 每出队一个节点,依次判断它周围的点是否

2022-03-22 21:59:27 708

原创 C#栈的实现及简单使用

栈的特点就是后进先出,它的实现比队列更简单,用一个列表或数组即可。public class MinStack { List<int> stack; public MinStack() { stack=new List<int>(); } public void Push(int val) {//入栈 stack.Add(val); } public void Pop() {//出

2022-03-20 17:22:42 1367 2

原创 二叉树经典例题

解决二叉树相关问题,常见的思路有两种,一是利用二叉树的遍历序列,二是利用递归,当然也可能是二者都有。对称二叉树判断一个二叉树是否关于root轴对称。这道题看起来似乎可以用中序遍历解决,因为对称二叉树的中序序列一定是回文的。但是中序序列为回文的二叉树未必是对称的,比如上图中假如把两个叶子节点的值改为2,它的中序就是2,2,1,2,2,但是它并不对称。这道题应该用递归来解决,不过注意如何比较左右子树public class Solution { public bool IsSy

2022-03-18 20:23:21 1482

原创 二叉树的遍历

深度遍历深度遍历又分为前序,中序,后序。无论是哪一种,左子树的序列、根节点和右子树的序列都是分开的,利用这一点可以递归解决深度遍历public List<int> InorderTraversal(TreeNode root) { List<int> a=new List<int>(),b=new List<int>(),c=new List<int>(); if(root==null) r

2022-03-18 16:24:11 1010

原创 C#队列实现及简单使用

队列的特性很简答,就是先进先出,一般利用数组来实现。实现队列自然要实现几个函数:入队,出队,判断队满,判断队空,获得队头,队尾。实现队列的关键在于队头指针和队尾指针的设置:假设初始状态下,队头指针为0,队尾指针为-1,那么两个指针指的位置分别就是队头与队尾。当队尾的下一个是队头时队空,当队尾的下下个是队头时队满。 假设初始状态下,队头队尾指针都为0,那么队尾指针指的是队尾,而队头指针的下一个位置才是队头。当两指针相等时队空,当队尾指针的下一个是队头时队满。如果我们画个图就会发现,不管怎么设置

2022-03-15 19:51:49 5415

原创 字符串和数组中的双指针方法

移除特定元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。如上图所示 ,当fast遇到val时一直前进直到遇到第一个不是val的值或者离开数组,然后将不是val的值赋值给slow值,注意无论slow是否指在val值上都要被fast值所覆盖,如下图这个瞬间,slow指的值实际上是3并

2022-03-15 14:27:48 145

原创 杨辉三角问题

杨辉三角的主要性质: 每个数等于它上方两数之和。 每行数字左右对称,由1开始逐渐变大。 第n行的数字有n项。 前n行共[(1+n)n]/2 个数。 第n行的m个数可表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。 注意虽然其中的每个数都可以用组合数C(n-1,m-1)表示,但是由于组合数公式需要用到阶乘,而阶乘25以上就会超过long长整型的上限,所以通过组合数直接求某个值或某行的值只能是n小于等于25。否则就必须通过迭代相...

2022-03-14 22:12:07 664

原创 字符串经典问题

最长回文子串给你一个字符串 s,找到 s 中最长的回文子串。注意,空串的创建方法是string xx="";C#中可以使用+来串联字符串;public class Solution { public string LongestPalindrome(string s) { string str=""; bool ishw; for(int i=0;i<s.Length-1;i++) { f

2022-03-12 23:00:53 767

原创 二维数组经典问题

解决二维数组问题需要注意的几个点:二维数组中行数和列数不一定相同,注意具体情况 多通过画图等手段找到索引之间的规律 注意数组的边界条件旋转矩阵旋转90度实际上是四个数字交换位置,那么我们只要遍历四分之一的数组,每次找到另外三个点,交换它们的位置就可以了。如何交换呢,我们假设4个数字按顺时针顺序分别为1,2,3,4,则交换以后原来位置上应该是4,1,2,3.而需要遍历的那四分之一数组就是正方形的上边为底的等腰直角三角形,如下图,注意三角的右对角线上的数字是不用遍历的,因为它们与左对角

2022-03-11 15:08:23 540

原创 Unity MonoBehavior之初始化与关闭

MonoBehaviour是unity的一个基类,在unity中创建一个脚本,默认就会继承它。而默认脚本中的start函数和update函数也是这个类中的。实际上这个类的内容非常多,它涵盖了一个游戏物体整个生命周期,如下图所示。而其中比较常用的就是这张图的开始和结尾部分,也就是游戏物体的初始化和销毁阶段。初始化这个阶段调用了Awake,Start,OnEnable这三个函数。首先他们都是只有对应物体初始化的时候才会调用(这是显然的)。Awake在物体初始化但对应脚本被禁用的时候也会被调用

2022-03-10 22:22:59 3957

原创 链表经典问题(二)

合并升序列表递归法当其中一个链表为空时,直接返回另一个。当都不空,假设除较小的头节点外都已合并,则只需要把头结点与以排列好的的头相连。class Solution {public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { if(list1==nullptr) return list2; if(list2==nullptr) return

2022-03-07 21:50:25 80

原创 链表经典问题

反转链表反转链表有两种方法,分别是迭代法和递归法。迭代法有两种思路,一种是把头结点的下一个节点一次移动到第一个,直到头结点变成最后一个;第二种是依次把第一个节点移动到尾结点的后面,直到尾结点变成第一个。递归法假设除头节点以外的所有节点都已反转,把头结点以后的链表看做一个整体,则需要做的操作就是把头结点移动到它的后面。class Solution {public: ListNode* reverseList(ListNode* head) { if(head

2022-03-06 22:07:14 447

空空如也

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

TA关注的人

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