shader入门-(线性代数)
Shader基础数学仅用作个人的常用提示,不会有全部详细介绍,资料来自《Unity Shader入门精要》
笛卡尔坐标系笛卡尔坐标系
构成
原点
N条过原点,相互垂直的坐标轴,主要看是几维
OpenGL和DirectX使用的笛卡尔坐标系不同
坐标轴又称作,基矢量
长度为1,的基矢量 — 标准正交基
四维空间 — 齐次坐标系
左/右手坐标系 三维的笛卡尔坐标系并不都是等价的,如果有相同旋向性,就可以通过旋转方法来让两个坐标系重合,但是如果旋向性不同,就不能重合。
在Unity中
模型空间和世界空间使用了左手坐标系
观察空间使用了右手坐标系
点和矢量点 – 空间中的一个位置
矢量/向量 – 包含模和方向的有向线段, 通常用来表示相对于某个点的偏移,只要模和方向不变,放哪儿都一样
矢量运算点积 — 结果是标量a · b = (ax,ay,az) · (bx,by,bz) = axbx + ayby + azbz
a · b = |a||b|cosθ
性质
a · b = b · a
ka · b = a · kb
a · (b + c) = a · b + a ...
链表练习中未注意的点
特定深度节点链表题目取自《程序员面试金典》4.3
思路类似广度优先遍历,通过遍历每一层,并逐层添加相应节点
错误来源没有正确的处理链表头节点的位置,因为力扣题目里没有直接使用LinkedList类,而是使用了最基本的节点,所以需要使用一个指针对头节点进行保存,另一个指针进行添加操作。
错误示范
12345678910111213public ListNode[] addLists(ListNode[] listOfLevel, int index, TreeNode tree){ if (tree == null) return listOfLevel; ListNode temp = listOfLevel[index]; while (temp!= null) { temp = temp.next; } temp = new ListNode(tree.val); temp = temp.next; ...
LinkedList介绍
Linked List 介绍资料来源《程序员面试金典》第九章
链表是由一些列节点(node)组成的数据结构,每个节点拥有指向下一个节点的指针(双向链表中,每一个节点同时拥有指向上一个节点和下一个节点的指针)。
单链表:
双链表:
链表的好处是可以在常数的时间添加和删除元素,在特定的情况下特别有用。和数组不同的是,链表无法在常数时间复杂度内访问链表的一个特定索引,如果想要访问第N个元素,就需要迭代访问N次。
Node数据结构1234567891011121314public class Node<T>{ public T Data { set; get;} public Node<T> Next { set; get;} public Node(T val){ this.Data = val; this.Next = null; } public Node(){ this.Data = defa ...
字符串和数组练习
LeetCode思路总结(C#)题目来自LeetCode,以及《程序员面试金典》第九章1.1-1.9
例题1.1实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
12输入:s = "leetcode"输出:false
示例 2:
12输入:s="abc"输出:true
提示:
0 <= len(s) <=100
如果不适用额外数据结构更好
思路1:使用额外数据结构,通常情况下题目里是使用ASCII码表示,如果编码不是ASCII这个思路将行不通。
ASCII码一共有128个,我们可以声明一个数组,将ASCII码的编号作为数组下标来检查字符是否重复,比如’a’可以用Array[97]表示,‘A’可以用Array[65]表示
12345678910public bool IsUnique(string astr){ int[] char_num = new int[128]; for(int i=0;i<astr.Length;i++){ char_num[a ...
BigO练习
Big O 练习例一题目来自《程序员面试金典》第六章例9
这段代码将平衡二叉搜索树的所有节点值相加。
123456int sum(Node node){ if(node == null){ return 0; } return sum(node.left) + node.value + sum(node.right);}
方法一:
由之前的基础介绍可知,通常情况下递归的时间复杂度为O(分支数^递归深度)。
二叉搜索树的高度约等于log2(N), N为节点数,分支为2,因此可得时间复杂度约为O(2^log2(N))。
由2^P = Q 可得,P = log2(Q)。令P = 2^log2(N),可得log2(P) = log2(N),所以P = N,因此时间复杂度简化为O(N)
方法二:
因为需要所有节点值相加,所以需要遍历N个节点,因此式O(N)
例二斐波那契数列的优化,取自《程序员面试金典》例14,例15
以下代码打印从0到n的斐波那契数列。
1234567891011void allFib(int n) ...
BigO基础介绍02
Big O 基础介绍(二)此文参考《程序员面试金典》(第六版)第六章。
多项式算法的加和乘算法中常见的分步形式如下:
O( A + B ) :
1234567for (int a : arrA){ print(a);}for (int b : arrB){ print(b);}
O( A * B ):
12345for (int a : arrA){ for (int b : arrB){ print(a + "," + b); }}
第一个例子,先遍历A数组,再遍历B数组,所以总数量是O( A + B )。
第二个例子,对A数组的每个元素都遍历B数组,所以总数量是O( A * B )。
”先做这个,再做那个”的形式,就是加
“对这个的每个做那个”的形式,就是乘
分摊时间在计算时间复杂度的时候常常会碰到最坏情况偶尔会出现,一旦发生会消耗很多资源,但是发生之后很长一段时间不会发生,因此需要兼顾正常情况和最坏情况,将时间进行”分摊“。
例如Jav ...
BigO基础介绍01
Big O 基础介绍(一)此文参考《程序员面试金典》(第六版)第六章
大O符号在算法中用于描述算法效率。
时间复杂度时间复杂度(渐近运行时间),也称为大O时间
举例:
假设有一个可以无限装下盒子的容器X,N个盒子,一个人P,地点A和B,从A到B运送时间相同。
方法一:P一次只能从A到B运送一个盒子
方法二:P也可以选择直接将盒子都装进X再从A到B运送容器X
使用方法一,随着盒子数目的增加,所消耗的时间也将线性增加,可以表示为O(N)
使用方法二,无论盒子怎么增加X都能装下,因此运送时间是固定的常量,可表示为O(1)
时间复杂度也能有很多的变量,比如给一个长X,宽Y,高Z的泳池注水,那么可以表示为O(XYZ)
O、θ 和Ω学术界描述运行时间有三种,Big O、Big θ (theta) 和 Big Ω (omega)
Big O:用于描述运行时间的上界,假设一个算法可以描述为O(N),那么也可以描述为O(N^2)。类似于,假设一个人可以活到130岁,那么年龄X<=130,也可以说年龄X<=1000,因为130是肯定小于1000的,这里的130就是上界。
Big Ω (ome ...
PicGo+Github搭建图床
本文写于2020-07-19,请参考时考虑时间以及软件版本
PicGo+Github搭建图床,方便图片上传、管理以及方便markdown的引用,文章参考
Github图床设置进入自己的Github账户,创建新的Repository并命名, 因为这里笔者已经创建过Image-Host的库,所以显示重名。
接着进入账户设置
进入Developer settings
点击Generate new token
为token添加描述,并点选repo, 接着点击最下方的Generate token按钮即可
注意:创建好后会生成一串token,此token只在github上显示一次,请妥善保存
PicGoPicGo为免费开源图床管理工具,下载地址在这Windows, Mac, Linux系统都有支持并且支持多种平台,如阿里云,腾讯云等
本文使用PicGo 2.2.2 ,下载好后如图所示
点开PicGo设置,因为仅使用Github作为图床,所以将剩余的平台显示关闭
点击打开图床设置
设定仓库名:Github账户名/仓库名
设定分支名:需填写为master
设定Token:将在github ...