- 博客(140)
- 收藏
- 关注
原创 Shader 渐变屏幕
uv坐标:二维空间每个像素绝对位置(0,0 ~ 宽高) gl_FragCoord.xy / 设备分辨率。思考,最终操作改变每个片元的颜色,就是根据uv坐标的不同逐片元计算,使用cos控制周期性效果。cos周期变化:delta时间,每帧间隔为主键。前置工作,创建缓冲,对顶点着色器传递顶点数据。对片元着色传递这些控制变量。
2024-04-20 17:51:32 213
原创 WebGl/Three 粒子系统 人物破碎及还原运动
首先,加载模型,这是万千粒子的前身,模型对象由很多面构成,这些面又是由各个点构成的,所以可以将模型的几何体对象geometry赋给粒子对象,粒子物体用Points方式渲染
2024-04-16 08:59:44 530
原创 双向链表
双向链表:既可以从头遍历到尾,又可以从尾遍历到头。一个节点既有向前连接的引用,也有一个向后连接的引用.双向链表可以有效的解决单向链表中提到的问题。特点:可以使用一个head和一个tail分别指向头部和尾部的节点。每个节点都由三部分组成: 前一个节点的指针(prev)/保存的元素(item)/后一个节点的指针(next)。双向链表的第一个节点的prev是null双向链表的最后的节点的next是nul
2024-03-24 15:51:06 539
原创 单向链表
链表类似于火车: 有一个火车头,火车头会连接一个节点,节点上有乘客(类似于数据),并且这个节点会连接下-个节点,以此类推.要存储多个元素,可以选择链表,但不同于数组,链表中的元素在内存中不必是连续的空间链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有些语言称为指针或者连接)组成
2024-03-24 15:35:50 237
原创 Threejs/WebGL中旋转变换的原理
在WebGL中,旋转矩阵通常是一种特殊的正交矩阵,它用于在三维空间中执行旋转变换。旋转变换属于正交变换,正交变换是一种线性变换,它保持向量的长度和角度不变,同时保持向量空间的正交性。在上图中,我们把旋转矩阵Rz应用于一个三角形,把他绕Z轴旋转90度,左边是旋转之前的三角形,右图是应用变换矩阵Rz(90度),即绕Z轴(垂直屏幕向外)旋转90度之后的三角形。另外,正向旋转可以用右手法则来确定,想象一下,用右手握住旋转轴,且大拇指的方向指向这个轴的正方向,则其他手指所指的方向就是正向旋转。
2024-03-09 19:09:48 854
原创 JS将图片转Base64的两种方法
实现原理:使用xhr请求图片,并设置返回的文件类型为Blob对象[xhr.responseType = “blob”]使用FileReader 对象接收blob。
2024-03-08 21:33:31 991
原创 线性代数:向量空间
目录向量空间 Ax = 0 的解空间S Ax = b 的全体解向量所构成集合不是向量空间 基、维数、子空间自然基与坐标 例1例2
2024-02-21 23:45:19 676 1
原创 线性代数:逆、转置、分块、多项式 矩阵公式总结
目录逆矩阵、转置矩阵重要公式公式 证明矩阵分块基本运算分块的逆(主副对角线分块对角阵的逆、主副对角线上下三角分块对角阵的逆) 例矩阵多项式例克拉默法则及逆矩阵求方程组
2024-01-21 19:01:51 752 1
原创 线性代数:矩阵运算(加减、数乘、乘法、幂、除、转置)
目录加减数乘 矩阵与矩阵相乘 矩阵的幂矩阵转置 方阵的行列式 方阵的行列式,证明:|AB| = |A| |B|
2024-01-21 18:00:33 878
原创 线性代数——行列式按行(列)展开
一、余子式:将行列式某元素所在行和列的元素全去掉 剩余部分所构成的行列式,称为该元素的余子式二、代数余子式三、行列式等于它的任一行(列)的各元素与对应代数余子式乘积之和四、行列式某行元素(列)与其他行(列)对应元素的代数余子式相乘,然后相加,最后结果为0五、范德蒙德行列式
2024-01-13 16:56:24 862 2
原创 线性代数——行列式相关性质
一、行列式与它的转置列行列式相等二、对换行列式的两行(列),行列式变号三、行列式某行(列)有公因子k,则k可以提到行列式外四、行列式中若两行成比例,则行列式为0五、行列式的某一行(列)的元素都是两数之和,则六、将行列式的某行(列)元素乘同一数加到另一行(列)对应的元素上,所得新行列式的值等于原行列式七、拉普拉斯展开式八、递推法求n阶行列式九、对称行列式与反对称行列式
2024-01-13 16:28:14 756
原创 C++ 类模板
C++中的类模板允许您创建可以适用于多个类型的通用类。类模板是一种将类型参数化的方法,可以根据需要实例化为具体类型的类。类模板语法:template类template ---声明创建模板typename---表面其后面的符号是一种数据类型,可以用class代替T ---通用的数据类型,名称可以替换,通常为大写字母模板参数列表可以包含一个或多个类型参数,用逗号分
2023-12-16 16:41:47 843
原创 C++ 函数模板
C++中的函数模板是一种通用的编程工具,允许您编写可以适用于不同类型的函数。函数模板是一种将类型参数化的方法,以便在需要时生成特定类型的函数。函数模板的使用:函数模板的声明使用关键字template来指示它是一个模板,后面跟着模板参数列表。使用函数模板有两种方式:自动类型推导、显示指定类型;模板参数列表可以包含一个或多个类型参数,用逗号分隔;在函数声明中,使用模板参数作为函数参数、返回类型或局部变量的类型;函数模板的定义通常放在头文件中。
2023-12-16 15:55:22 882
原创 C++ 多态
C++中的多态性是面向对象编程的重要特性之一,它允许不同的子类对象对同一消息做出独特的响应。C++中的多态性可以通过虚函数和继承来实现。1 静态多态性和动态多态性:静态多态性(编译时多态)是指通过函数重载和运算符重载实现的多态性,编译器在编译时根据上下文决定实际调用的函数或运算符。动态多态性(运行时多态)是指通过继承和虚函数实现的多态性,运行时根据对象的实际类型来确定调用的函数。
2023-12-16 14:14:48 955
原创 C++ 运算符重载
在C++中,运算符重载是一种强大的特性,允许您重新定义已定义的运算符,以便它们适用于用户自定义类型。通过运算符重载,您可以编写自定义类型的运算符行为,使得用户自定义类型的对象可以像内置类型一样进行运算。
2023-12-16 11:25:10 520
原创 C++ 继承
继承中构造和析构的顺序:继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反。继承同名成员处理方式:子类对象可以直接访问到子类中同名成员子类对象加作用域可以访问到父类同名成员。当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数。多继承中如果父类中出现了同名情况,子类使用时候要加作用域。
2023-12-10 21:03:22 880
原创 C++ 友元
在C++中,友元(friend)是一种特殊的访问机制,它允许类之间的非成员函数或类访问其他类的私有成员。友元提供了一种在不侵犯封装性的情况下,使外部函数或类能够与类内部进行交互的方式。全局函数做友元:友元函数(友元非成员函数):友元函数是在类外部定义的非成员函数,在类声明中使用friend关键字进行声明。友元函数可以访问该类的私有成员和受保护成员
2023-12-10 18:23:58 402
原创 C++:this指针
c++通过提供特殊的对象指针,this指针 指向被调用的成员函数所属的对象。this指针是隐含每一个非静态成员函数内的一种指针this指针不需要定义,直接使用即可当形参和成员变量同名时,可用this指针来区分在类的非静态成员函数中返回对象本身,可使用return *thisthis指针是一个特殊的指针,用于访问当前对象的成员。它提供了一种便捷的方式来引用当前对象的成员变量和成员函数,并解决名称冲突的问题。
2023-12-10 17:55:53 1101
原创 C++ 对象的初始化和清理:构造函数和析构函数
构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。构造函数语法:类名(){}。构造函数,没有返回值也不写void。函数名称与类名相同。构造函数可以有参数,因此可以发生重载。程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次析构函数。主要作用在于对象**销毁前**系统自动调用,执行一些清理工作。析构函数语法:~类名(){}。析构函数,没有返回值也不写void函数名称与类名相同,在名称前加上符号 ~析构函数不可以有参数,因此不可以发生重载程
2023-12-09 19:09:09 1082
原创 C++ 内存分区模型
C++的内存分区模型描述了程序在运行时如何使用系统内存。了解内存分区模型对于理解程序的内存管理和运行效率非常重要!在一般情况下,C++程序在内存中的布局可以分为以下几个主要区域:栈(Stack)栈是用于存储局部变量、函数参数、函数返回地址以及函数调用时所需的临时数据的区域。栈的大小在程序运行时是可以动态变化的,通常由系统自动管理。栈内存的分配和释放是由系统自动完成的,遵循"先进后出"的原则。
2023-12-09 00:38:46 1292
原创 C++ 引用
在C++中,引用是一个允许我们创建一个别名或者称之为变量的另一个名字的概念。通过引用,我们可以通过原始变量的别名来访问原始变量的值。引用提供了对原始变量的间接访问,我们可以通过引用来读取或修改原始变量的值。引用在声明时必须初始化,并且一旦初始化完成后,它将一直引用同一个变量,无法再引用其他变量。引用在内部是通过指针来实现的,但其使用方式更类似于普通变量,因此可以简化指针的使用。函数参数中使用引用可以避免对象的拷贝,提高运行效率。引用常常用于函数返回值,允许函数返回引用指向的变量。
2023-12-09 00:11:23 842
原创 C语言:结构体
结构体内存对齐规则:1. 第一个成员在与结构体变量偏移量为0的地址处。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。(vscode没有编译器对齐数,对齐数就是成员自身大小)3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
2023-11-19 23:51:04 703 4
原创 C语言:动态内存管理
为什么存在动态内存分配?原本的内存开辟方式有:int val = 20;在栈空间上开辟四个字节、char arr[10] = {0};在栈空间上开辟10个字节的连续空间。但是上述的开辟空间的方式有两个特点:1. 空间开辟大小是固定的。2. 数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配。但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。 这时候就只能试试动态存开辟了。
2023-11-19 22:59:32 337
原创 C语言 字符函数汇总,模拟实现各字符函数(炒鸡详细)
strcmp:两个字符串比较相等。原型: int strcmp ( const char * str1, const char * str2 );比较是基于字符的 ASCII 值来进行的。strcmp() 会逐个比较两个字符串对应位置上的字符的 ASCII 值,并按照以下规则返回结果:当找到不同的字符时,根据其 ASCII 值的大小关系决定比较结果。较小的字符对应的字符串被认为是较小的。如果一个字符串是另一个字符串的前缀,则较短的字符串被认为是较小的。strcmp() 是区分大小写
2023-11-19 22:04:43 374
echarts,想问下箭头所指的文字和小点点是什么配置项
2023-09-15
threejs如何实现链接中的鼠标跟字体交互效果
2023-09-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人