- 博客(55)
- 问答 (3)
- 收藏
- 关注
原创 unity shader立方体纹理中的反射以及折射效果的实现
如果不考虑反射效果的话,在场景中的问题的镜面表面的效果应该是用表面的法线对立方体纹理进行采样得到该点的颜色。
2022-06-26 21:34:44 493
原创 games101-Assignment05光线追踪-光线与三角形相交
要求:修改Render()和rayTriangleIntersect():Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相应像素中。Triangle.hpp 中的 rayTriangleIntersect(): v0, v1, v2 是三角形的三个顶点,orig 是光线的起点,dir 是光线单位化的方向向量。tnear, u, v 是你需要使用我们课上推导的 Moller-Trumbo
2022-05-18 21:36:13 541
原创 games101-Assignment04作业04
要求:修改main.cpp中的bezier和 recursive_bezier函数:bezier:该函数实现绘制 Bézier 曲线的功能。它使用一个控制点序列和一个OpenCV::Mat 对象作为输入,没有返回值。它会使 t 在 0 到 1 的范围内进行迭代,并在每次迭代中使 t 增加一个微小值。对于每个需要计算的 t,将调用另一个函数 recursive_bezier,然后该函数将返回在 Bézier 曲线上 t处的点。最后,将返回的点绘制在 OpenCV ::Mat 对象上。recur
2022-05-16 20:38:36 191
原创 GAMES101 13节 光线追踪 笔记
光线追踪渲染时间花费较多,适用于影视类的离线渲染。光线的特点光线沿直线传播光线与光线之间不会发生碰撞光线一定是从光源出发,最后进入人的眼睛光路是可逆的样例前提:眼睛和光源都假设为点没有大小eye ray: 眼睛过image plane的一个像素做射线,最终取射线与物体相交的最近的点。(巧妙的解决了深度测试的问题,取最近的点,也就是比这个点远的点直接舍弃,也就不会有后续的shadow ray了)shadow ray: 相交的点与光源连接的射线,如果光源到这个点的路径中有其他的点,则
2022-04-05 23:06:52 401 3
原创 剑指offer 最长不含重复字符的子字符串
最长不含重复字符的子字符串描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。题解:维护一个map用来存放遍历到的字符以及下标maxlen用来存放最大的长度值curlen用来存放现在正在遍历的不重复字符串的长度存在三种情况:当前字符没有出现过,也就是map中没有这个字符的信息,此时curlen++当前字符减去上一次该字符出现的下标大于curlen,说明该字符上一次字符出现的时候在上一个计算的不重复字符串中,也就是这一个字符并没有重复,curlen++当前
2022-03-06 17:45:08 132
原创 剑指offer 礼物的最大价值
礼物的最大价值描述:在一个m\times nm×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?如输入这样的一个二维数组,[[1,3,1],[1,5,1],[4,2,1]]那么路径 1→3→5→2→1 可以拿到最多价值的礼物,价值为12解题:一开始可能会想到,判断每个元素的右边元素和下面元素哪个更大,每个元
2022-03-06 11:47:22 358
原创 c++--指定vector的大小(一维和二维)
一维不指定vector的大小vector<int> vec;指定vector的大小//vec的长度是5,也就是vec.size()=5vector<int> vec(5);二维不指定vector的大小vector<vector<int>> vec;指定vector的大小//创建一个长度为5的vectorvector<int> temp(5);//创建二维数组,5列5行的二维vectorvector<vector
2022-03-06 11:28:53 5614
原创 剑指offer 跳台阶扩展问题
跳台阶扩展问题题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法?解题:f[0]=f[1]=1f[n]=f[n-1]+f[n-2]+…+f[0]因为 f[n-1]=f[n-2]+…+f[0]所以 f[n]=2 * f[n-1]同理 f[n-1]=2 * f[n-2]最终得到 f[n]=2 * 2 * 2 * … * f[0]代码:class Solution {public: int jumpF
2022-03-05 16:36:25 122
原创 剑指offer 正则表达式匹配
正则表达式匹配题目要求:请实现一个函数用来匹配包括’.‘和’‘的正则表达式。1.模式中的字符’.‘表示任意一个字符2.模式中的字符’'表示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配解题代码:class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
2022-03-05 15:51:47 172
原创 剑指offer 连续子数组的最大和(二)
连续子数组的最大和(二)题目要求:输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,找到一个具有最大和的连续子数组。1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组2.如果存在多个最大和的连续子数组,那么返回其中长度最长的,该题数据保证这个最长的只存在一个3.该题定义的子数组的最小长度为1,不存在为空的子数组,即不存在[]是某个数组的子数组4.返回的数组不计入空间复杂度计算题解:题目有两个要求
2022-03-03 16:45:23 407
原创 链表-倒数最后k个结点
题目:输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。如果该链表长度小于k,请返回一个长度为 0 的链表。例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。解题思路:设置两个指针,flag和cur,flag到达链表尾部的时候,flag与cur之间的距离标识k值。解题代码:/** * struct ListNode {
2021-12-13 23:02:09 809
原创 数据结构-STL中的set和map
set一个排序后的容器,不允许重复。set具有高效的插入、删除和执行基本查找。==insert:==插入,如果容器中没有重复的元素,插入成功,如果有重复的元素,插入失败。==erase:==删除。==find:==查找元素。map一个根据键逻辑排序的存储键和值组成的项的集合。==insert:==插入,如果容器中没有重复的元素,插入成功,如果有重复的元素,插入失败。==erase:==删除。==find:==查找元素。...
2021-12-13 21:40:38 836
原创 链表-反转链表
题目:给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转换过程如下图所示:解题思路:反转链表也就是让每个结点的next指针反向指向前一个结点,我们可以想到的是,如下图步骤:其中:pre是用来指向反转需要指向的前一个结点,一开始的时候pre为nullptr。cur是用来指向当前的结点。next是用来指向cur的下一个结点,因为cur的结点的next如果一旦
2021-12-13 15:10:51 890
原创 链表-两个链表的第一个公共结点
题目:输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)例如,输入{1,2,3},{4,5},{6,7}时,两个无环的单向链表的结构如下图所示:可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。输入描述:输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和二个链表的公共部分。 后台会将这3个参数组装为两个链表,并将这
2021-12-13 14:44:35 208
原创 链表-合并两个排序的列表
题目:输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:解题思路:题目中有很重要的一个信息是:两个链表都是递增的。说明最终合成的列表的第一个结点,一定是两个链表的头结点中较小的那个。而结果链表接下来的结点,应该是两个链表接下来的结点中较小的结点。
2021-12-12 23:40:36 131
原创 数据结构-二叉查找树
性质:对于树中的每一个结点,它的左子树的所有结点的值都小于该节点的值,它的右子树的所有结点的值都大于该节点的值。方法:contains在树T中是否有项为X的结点。如果T为空,返回false。如果T不为空,X就是T的根节点,返回true。如果T不为空,X不是T的根节点,就根据X与根节点的关系,对左子树或者是右子树进行递归操作。bool contains(const Comparable &x,BinaryNode *t) const {if(t==NULL) return fa
2021-12-09 15:37:25 228
原创 数据结构-二叉树、表达式树
二叉树每个结点都不能有多于两个儿子。二叉树的实现struct BinaryNode{Object element;//元素BinaryNode *right;//右子树BinaryNode *left;//左子树}//因为不会超过两个儿子所以直接定义两个孩子,如果只有一个孩子或者没有孩子将结点设置为空即可。应用表达式树根节点是操作符,左子树和右子树是操作数。后缀表达式转换成表达式树通过栈栈将中缀表达式转换成后缀表达式,再将后缀表达式转换为表达式树。转换规则:如果是操作数:新
2021-12-09 14:23:07 186
原创 数据结构-树
基础知识:树是一些结点的集合,可以是空集合,如果不是空集合,则树由一个根节点r以及零个或者多个非空子树组成。每棵子树的根节点都通过一条边和树的根节点相连。一棵树由N个结点和N-1条边(每条边都连接着结点和他的父节点,只有根节点没有父节点,所以是N-1条边)叶节点:没有儿子的结点叫做叶节点。兄弟节点:同一个父亲结点的结点互为兄弟节点。结点n1到n2的路径为一个结点的序列。路径的长是路径上的边的边数。ni的深度:根节点到ni结点的唯一路径的长。根节点的深度为0。ni的高度:从ni到一片叶子的最
2021-12-08 21:44:30 335
原创 数据结构-栈的使用-后缀表达式的计算和转换
后缀表达式的计算:遍历后缀表达式:如果遇到数:将数压入栈中如果遇到符号:弹出栈中的两个数,作为符号的两个操作数,第一个弹出的数在后,第二个弹出的数在前,进行计算,将得到的结果压入栈中。最终遍历完后缀表达式之后的栈中所存储的数,便是后缀表达式的计算结果。例如:6523+8*+3+*①6523都被压入栈中,栈顶元素是3。栈顶3256②遇到+号,弹出2和3,计算2+3=5,将5压入栈中。栈顶556③8压入栈中。
2021-12-08 14:45:26 898
原创 数据结构-栈的使用-括号对应
括号对应检测思路:1、如果遇到一个左括号,就将符号压入栈中。2、如果遇到一个右括号:栈为空:表示没有相应的左括号与之对应,所以检测不合法栈不为空:弹出栈顶元素,①如果弹出元素与右括号相对应则合法,②如果弹出元素与右括号不是对应的符号,则检测不合法。3、其余符号不做操作。4、如果遍历完所有字符之后,栈不为空,则说明存在多余单个的括号,检测不合法...
2021-12-08 13:04:45 337
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人