- 博客(68)
- 问答 (1)
- 收藏
- 关注
原创 3D数学基础:图形和游戏开发(第2版)第7章笔记
极坐标空间只有一个轴(极轴),它通常被描述为来自原点的射线。在数学文献中,极轴通常在图表中指向右,因此在笛卡尔坐标系中,它对应于+x轴。使用二维极坐标定位一个点(r, θ)r定义了点到原点的距离,θ定义了点到原点的方向。对于任何给定的点,有无穷多个极坐标对可以用来描述这个点。这种现象被称为别名( Aliasing)。如果两个坐标对的数值不同,但指向空间中的同一点,则它们被称为彼此的别名。注意,在笛卡尔空间中不会出现别名——空间中的每个点都被分配了一个(x, y)坐标对:点到坐标对的映射是一对一的。一般来说,
2022-06-05 11:45:00
1696
1
原创 3D数学基础:图形和游戏开发(第2版)第6章笔记
方型矩阵M的行列式记为| M |,在其他一些书中,记为“det M”。非方阵的行列式没有定义。2 × 2矩阵的行列式3 × 3矩阵的行列式如果我们把一个3 × 3矩阵的行解释为三个矢量,那么这个矩阵的行列式就等价于这三个矢量的所谓“三重积”:子矩阵行列式:假设M是一个r行c列的矩阵。考虑M中删除第i行和第j列得到的矩阵,这个矩阵显然有r - 1行和c - 1列。这个子矩阵的行列式记为M{ij}M^{\{ij\}}M{ij},称为M的子矩阵。矩阵的余子式:Cij=(−1)i+jM{ij}C^{i
2022-06-04 22:20:14
1881
原创 3D数学基础:图形和游戏开发(第2版)第5章笔记
在二维中,我们只能做一种旋转:绕一个点旋转(不包括平移)。围绕原点的二维旋转只有一个参数,角θ,它定义了旋转的量。大多数数学书中的标准惯例是认为逆时针旋转为正,顺时针旋转为负。(然而,不同的约定适用于不同的情况。)二维旋转矩阵在三维中,旋转发生在轴上(不考虑平移),而不是点上,旋转轴不一定是x轴、y轴或z轴中的一个,旋转的方向遵循左手规则。绕x轴旋转的三维矩阵绕y轴旋转的三维矩阵绕z轴旋转的三维矩阵绕任意轴旋转的三维矩阵推导:定义θ为绕轴旋转的量。轴将由单位矢量定义。计
2022-06-04 17:48:41
1923
原创 3D数学基础:图形和游戏开发(第2版)第4章笔记
4.1节严格地从数学的角度讨论了矩阵的一些基本性质和操作。(更多矩阵运算将在第6章中讨论)4.2节解释了如何几何解释这些属性和操作。4.3节将矩阵的使用在本书中更大的线性代数领域。在线性代数中,矩阵是排列成行和列的数字的矩形网格。回想我们前面将向量定义为一维数列的定义,矩阵同样可以定义为二维数列。(“二维数组”中的“二”来自于行和列,不应该与二维向量或矩阵混淆)。所以向量是标量的数组,矩阵是向量的数组。矩阵元素的下标符号表示矩阵的对角元素(diagonal elements)如果一个矩阵中所有的
2022-06-04 10:45:37
411
原创 3D数学基础:图形和游戏开发(第2版)第3章笔记
大多数人认为在不同的情况下使用不同的坐标空间更方便。使用多个坐标空间的原因是仅在特定的参考系中才知道某些信息。理论上所有的点都可以用一个“世界”坐标系来表示,这可能是正确的。但是对于某一点a,我们可能不知道a在“世界”坐标系中的坐标。但是我们可以表示出与其他坐标系的相对关系(比如我知道我的电脑显示器在我的前面,但是我不知道我的电脑显示器的经纬度)。世界坐标系是一种特殊的坐标系,它为所有其他要指定的坐标系建立了“全局”参考系。换句话说,我们可以用世界坐标空间来表示其他坐标空间的位置,但是我们不能用任何更大
2022-06-04 08:40:51
540
原创 3D数学基础:图形和游戏开发(第2版)第2章笔记
对数学家来说,向量是一组数字。在程序员眼里,向量 = 数组。向量的维度表示这个向量包含多少个数字。向量可以是任何正维度,包括1个。事实上,标量可以被认为是一维向量。一个水平写的向量被称为行向量,例如:[1,2,3]。一个垂直写的向量被称为列向量,例如:(也可以写成[1,2,3]T)当我们在一段中写向量时,我们通常在数字之间加逗号。当我们把它写成方程时,逗号常常被省略。向量的下标符号表示对于任何给定的向量维数,都有一个特殊的向量,称为零向量,它在每个位置上都是零。例如,三维零向量是(0, 0, 0)。我
2022-06-04 00:24:33
718
1
原创 3D数学基础:图形和游戏开发(第2版)第1章笔记
对有理数的研究称为离散数学,对无理数的研究称为连续数学。然而,事实是,无理数只不过是一种精致的虚构。正如任何有声望的物理学家都会告诉你,它们是一种相对无害的妄想。宇宙似乎不仅是离散的,而且是有限的。由此可见,我们可以只用离散的数学来描述宇宙,并且只需要使用自然数的一个有限子集(很大,是的,但有限)。在某个地方,某个地方可能有一个外星文明,他们的技术水平超过了我们,他们从未听说过连续数学、微积分基本定理,甚至从未听说过无限的概念;即使我们坚持,他们也会坚定而礼貌地坚持不使用π,他们非常乐意使用3.14159
2022-06-03 17:23:18
789
1
原创 VS常见错误之一:LNK1168无法打开进行写入
问题样式:LNK1168 无法打开 xxx.exe 进行写入 xxx 运行程序, 退出不是按正常流退出,是按窗口右上角的“X”来关闭程序,但是后台的xxx.exe控制台程序还在运行。修改程序的代码后再运行,就会报LNK1168的错误。方法一、Ctri + Shift + Esc 打开任务管理器,点击详细详细,找到对应的进程手动关掉。方法二、方法一需要手动关闭,这挺麻烦的。能不能关闭窗口后,自动把这个程序关闭呢?在菜单中的工具 -> 选项, 打开如下设置对话框,在调试分类下,有一项调试停止
2022-05-30 19:38:09
58042
18
原创 C/C++游戏开发(easyx框架)及时类——极速赛车
本游戏用到了图形界面库graphics.h,图形界面库下载安装:下载链接:https://easyx.cn/download游戏截图:加载游戏资源图片右键打开项目属性,添加 -> 现有项,添加资源图片进项目·。资源图片链接:https://pan.baidu.com/s/1DxvqSOzE3Elz3KKLbMOUUA?pwd=hd1o提取码:hd1oIMAGE road, grass, car;void initgamePicture() { loadimage(&gra
2022-05-30 14:30:18
5056
6
原创 C/C++游戏开发(easyx框架)回合制——魔塔
本游戏用到了图形界面库graphics.h,图形界面库下载安装:下载链接:https://easyx.cn/download游戏截图:首先是玩家的定义,使用结构体,这个名字是可以自己改变的struct gamerole{ char name[20]; //玩家名字 int HP; //血量 int MP; //魔法 int DEF; //防御 int ATT; //攻击 int Lv; //等级 int Exp; //经验 int Num_Blue_Key; /
2022-05-25 18:54:16
5187
9
原创 VS常见错误之一:C2665: 2 个重载中没有一个可以转换所有参数类型
问题样式:C2665 “xxx”: 2 个重载中没有一个可以转换所有参数类型简单来说,这是由于字符编码问题引起的。VC6 默认使用的 MBCS 编码,而 VC2008 及高版本 VC 默认使用的 Unicode 编码。以下详细解释这个问题:用 char 表示字符时,英文占用一个字节,中文占用两个字节。这样有一个严重的问题:两个连续字节,究竟是两个英文字符,还是一个中文字符?为了解决这个问题,Unicode 编码诞生了。Unicode 编码不管中文英文都用两个字节表示。对于 MBCS 编码,字符变
2022-05-25 13:32:50
14754
6
原创 golang ORM框架gorm
ORM简介对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库(如mysql数据库)存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。安装go get -u gorm.io/gorm快速入门package mainimport ( "gorm.io/gorm" "gorm.io/driver/mysql")type Product str
2022-05-24 23:04:30
3381
原创 golang连接MySQL数据库
golang连接MySQL数据库安装配置mysql驱动导入驱动获得数据库连接数据库操作查询操作插入、更新、删除数据安装配置mysql驱动安装驱动go get -u github.com/go-sql-driver/mysql初始化模块go mod init 模块名称执行go mod tidygo mod tidy导入驱动import ( "database/sql" _ "github.com/go-sql-driver/mysql")获得数据库连接获得连接
2022-05-22 21:57:51
412
原创 Golang格式化输出
Golang格式化输出向外输出fmt.Printfmt.Fprintfmt.Sprintfmt.Errorf获取输入fmt.Scanfmt.Scanffmt.Scanlnbufio.NewReaderFscan系列Sscan系列占位符通用占位符布尔型整型浮点数与复数字符串和[]byte指针宽度标识符其他flagfmt包实现了类似C语言printf和scanf的格式化I/O。向外输出fmt.PrintPrint系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支
2022-05-22 08:02:45
1058
原创 Linux(C++)连接MySQL数据库
Linux(C++)连接MySQL数据库一、 环境安装二、 配置三、 头文件四、 函数1. 分配或初始化MYSQL对象2. 连接一个mysql服务器3. 执行指定查询语句字符串的SQL查询4. 获取最后一次查询语句字符串的SQL查询的结果集5. 返回结果集中的行数6. 返回结果集中的列数7. 获取下一个列的类型8. 从结果集中获取下一行9. 获取对应列的类型10. 关闭MYSQL五、C++封装MyDB类一、 环境安装首先是MySQL的安装,直接只用apt-get命令安装(这里推荐使用这种方式安装,因为
2022-05-19 21:07:21
3790
3
原创 C/C++封装socket通信类
不管是socket通信程序的客户端还是服务端,准备工作的代码又长又难看占地方,影响了主程序的结构,必须分离出来。一、C的封装方法C语言只能把程序代码封装成函数。1、客户端把客户端连接服务端的socket操作封装到connecttoserver函数中,主程序的代码更简洁。// TCP客户端连服务端的函数,serverip-服务端ip,port通信端口// 返回值:成功返回已连接socket,失败返回-1。int connecttoserver(const char *serverip,const
2022-05-17 11:23:01
3804
原创 C语言实现并发http服务器项目
C语言实现并发http服务器项目设置端口号创建套接字接收客户端请求获取客户端http请求数据实现Http解析实现Http响应多线程实现并发完整代码设置端口号我这里设置的是1234#define SERVER_PORT 1234创建套接字#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <arpa/inet.h>
2022-05-17 10:22:04
1675
原创 Qt连接MySQL数据库
我用的是Qt5.12与MySQL8.0的版本第一步在Qt的安装目录下找到源码文件夹,找到MySQL的插件文件夹,例如:D:\qt\5.12.0\Src\qtbase\src\plugins\sqldrivers\mysql找到mysql.pro这一个Qt项目文件,双击打开。TARGET = qsqlmysqlHEADERS += $$PWD/qsql_mysql_p.hSOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cppQMAKE_USE += m
2022-05-06 16:39:36
799
原创 QT(C++)连接MySQL中文乱码解决
1、QSqlDatabase对象设置UTF-8编码QSqlDatabase db;db.exec("SET NAMES 'UTF-8'");2、将MySQL编码设置成UTF-8show variables like 'character_set_%';各字段的含有如下:主要关注的是character_set_client、character_set_connection、character_set_results这三个变量。他们的含义可以看以下例子:首先client一般会发送一条s
2022-05-06 15:59:57
2364
1
原创 VS常见错误之一:LNK2019 : 无法解析的外部符号
问题样式:LNK2019 : 无法解析的外部符号 xxx 中被引用采用开源程序,忘记添加依赖项,这个是最常见的问题。解决办法如下:右键打开项目属性C/C++、附加包含目录:填写附加头文件所在目录 分号间隔多项链接器、常规、附加库目录:填写附加依赖库所在目录 分号间隔多项链接器、输入、附加依赖项:填写附加依赖库的名字.lib 空格或分号间隔多项如果还是不行,更换与依赖项合适的平台:如果没有,就新建平台在新的平台下再右键打开项目属性配置选项(再次执
2021-11-27 00:02:34
34859
7
原创 锐捷校园网VMware虚拟机网络服务自动打开
锐捷会把VMware NAT Service这一服务自动关掉,手动开启过几秒中就又被锐捷给关掉。解决方法:写个bat脚本每过一段时间开启一次VMware NAT Service新建txt文件,写入:beginnet start "VMware NAT Service"CHOICE /T 1 /C ync /CS /D y /ngoto begin这个代码是每一秒开启一次VMware NAT Service可以把"CHOICE /T 1 /C ync /CS /D y /n"中的‘1’改成
2021-11-21 21:33:53
481
2
原创 Kali Linux 内核头文件安装
Kali Linux 内核头文件安装一、使用apt-get命令准备内核头文件。执行命令如下所示:apt-get install linux-headers-`uname -r`#或apt-get install linux-headers-$(uname -r)如果找不到软件包,执行下一步二、查看信息查看内核信息uname -r查看可用的linux-header版本apt-cache search linux-headers-发现对应的内核软件包没有。因为kali每更新一次
2021-11-01 19:53:22
5598
2
原创 linux root密码重置与反重置
有时忘记了密码或忘记了用户名导致登陆不上linux,可以试一下这个方法:首先开机后在这个界面上按e;进入这个界面按↓找到中的改成rw rd.break接着按ctrl+x后进入界面依次输入以下的命令:chroot sysroot //进入系统的根目录passwd //重置密码新密码确认密码touch /.autorelabel //创建文件,让系统重新启动时能够识别修改exit //退出chroot模式reboot //重启系统重启之后就可以使用刚才重置的
2021-10-27 16:49:13
570
2
原创 MySQL常用命令 检索版
tips:按ctrl + F 进行检索启动、关闭MySQL服务net start mysqlnet stop mysql用户连接数据库。mysql -h 主机地址或localhost -u用户名 -p退出MySQLexit显示服务器的数据库:show databases;创建数据库create database 库名;删除数据库drop database 库名;选择数据库use 库名;查看现在的数据库中的表show tables;创建表create table 表名(
2021-10-23 18:16:08
216
原创 (动态规划)Educational Codeforces Round 107 (Rated for Div. 2) E. Colorings and Dominoes
题目:https://codeforces.ml/contest/1511/problem/EYou have a large rectangular board which is divided into n×m cells (the board has n rows and m columns). Each cell is either white or black.You paint each white cell either red or blue. Obviously, the numbe
2021-04-20 18:05:01
135
原创 (树形dp)hdu 5834 Magic boy Bi Luo with his excited tree
题目hdu5834题意:在一棵树上,每个结点都有不同的价值,每条边都有不同的代价,每个结点的价值只能获取一次,但是每经过一条边都要扣除相应的代价。输出从结点1~n 开始获取价值的最大值。思路:从结点开始获取价值的最大值 = max(子树回来 + parent不回来,parent回来 + 子树不回来)结点p 的子树s 回来和子树s 不回来的最大值好求:0表示不回来,1表示回来子树s 回来:遍历每个子树s(结点p 到结点s 的代价w),dp [ p ] [ 1 ] = max (dp [ p
2021-02-18 19:04:29
172
1
原创 (树形dp)hdu 3586 Information Disturbing
题目hdu3586题意:给出一个以结点1为根的树,切掉每一条边都有对应的代价,可以切掉任意条边,使得结点1到达不了这棵树所有的叶子结点,输出不超过代价m 的情况下的边的代价的最大值最小。举个例子:在m = 5 的条件下:思路:结点1到达不了这棵树所有的叶子结点 可以转化为 ∑\sum∑ 结点p 的下一层的子结点到达不了以子结点为根的子树所有的叶子结点的最小代价但是题目求的是不超过代价m 的情况下的边的代价的最大值最小,如果用上面的思路可能答案有些错,就像上个例子的第二种情况一样,所有要枚举不
2021-02-16 17:29:30
113
原创 (树形dp & 有依赖的背包)hdu 1011 Starship Troopers & hdu 1561 The more, The Better
题目hdu1011题意:一张图有 n 个结点,有 m 个士兵,每个士兵可以消灭 20 个虫子,结点1是入口,通过边可以走的任意一个结点并消耗结点上的虫子对应的士兵获得这个结点对应的脑子,当没有士兵后就不能继续往下走。另一种解释:有一个m个容量的背包,有 n 个物品,每个物品的一个代价u 和一个价值v,有些物品如果拿走需要对应的物品也被拿走,求m个容量最大的价值。(即背包9讲中的有依赖的背包)思路:每个结点p 的代价为c [ p ],价值为v [ p ]从结点1 dfs 下去,在每个结点p 中
2021-02-15 09:21:21
92
原创 (树形dp)poj 3140 Contestants Division
题目poj3140题意:有一张图,可以把其中一条边去掉把图分成两个部分,输出最小的两个部分的值的绝对差。思路:记录全图的总价值cnt;以结点1为根,dp [ i ] 为记录第 i 个结点向下的连通度。对于其中一个结点 p ,遍历与它有边的结点s1,s2,,,sn,ans=mini=1n∣dp[i]+v[i]−(cnt−(dp[i]+v[i]))∣=mini=1n∣(dp[i]+v[i])∗2−cnt∣ ans = \min_{i=1}^{n}|dp[i]+v[i]-(cnt-(dp[i]
2021-02-14 19:26:44
91
原创 (树形dp)poj 3107 Godfather
题目poj3107题意:有一棵树,以某个结点为根并切断这个结点使得它下一层子树的最大连通度的值最小,如果有这样的结点则输出结点的编号。思路:以结点1为根,记录每个结点向下的连通度(向上的连通度 = n - 向下的连通度)。对于其中一个结点 p ,遍历与它有边的结点s1,s2,,,sn,如果结点 si 的向下的连通度 < 结点 p 向下的连通度,那么这个结点 si 是结点 p 的子树,那么这个结点 si 在删除结点 p 后的连通度 = 这个结点 si 的向下的连通度。如果结点 si 的向
2021-02-14 16:30:03
116
原创 (树形dp)poj 2378 Tree Cutting
题目poj2378题意:有一棵树,以某个结点为根并切断这个结点使得它下一层所有的子树的连通度 ≤ n / 2,如果有这样的结点则输出结点的编号。思路:以结点1为根,记录每个结点向下的连通度(向上的连通度 = n - 向下的连通度)。对于其中一个结点 p ,遍历与它有边的结点s1,s2,,,sn,如果结点 si 的向下的连通度 < 结点 p 向下的连通度,那么这个结点 si 是结点 p 的子树,那么这个结点 si 在删除结点 p 后的连通度 = 这个结点 si 的向下的连通度。如果结点
2021-02-14 14:20:00
105
原创 (区间dp)poj 2955 Brackets
题目poj2955题意:给出字符串,求字符串中有(可以不连续)有多少对“ () " 和 “ [] ”思路:在区间 [ i , j ] 内,如果a [ i ] = ‘(’ 并且a [ j ] = ‘)’(或a [ i ] = ‘[’ 并且a [ j ] = ‘]’ ),则dp[i][j]=max(maxk=ij−1dp[i][k]+dp[k+1][j],dp[i+1][j−1]) dp[i][j]=max(\max_{k=i}^{j-1}dp[i][k]+dp[k+1][j], dp[i+1]
2021-02-13 23:43:58
83
原创 (区间dp)poj 1141 Brackets Sequence
题目poj1141题意:给出字符串,求使其成为常规字符串的最短字符串例如,以下所有字符序列都是常规方括号序列:(),[],(()),([]),()[],()[()]并且以下所有字符序列都不是:(,[,),)(,([)],([(]思路:dp数组是记录区间 [ i , j ] 成为常规字符串的最短次数。在区间 [ i , j ] 内,如果a [ i ] = ‘(’ 并且a [ j ] = ‘)’(或a [ i ] = ‘[’ 并且a [ j ] = ‘]’ ),则dp[i][j]=min
2021-02-13 22:39:47
92
原创 (区间dp)hdu 5115 Dire Wolf
题目hdu5115题意:有 n 头狼,打死一头狼,将受到与该狼当前攻击相同的伤害 + 当前相邻狼提供的额外攻击。并且该狼的相邻狼相邻(即有5头狼,打死了第二头狼,那么第一头和第三头相邻)。可以决定击败狼的次序。计算打败所有狼所需的最少伤害。思路:在区间[ i ,j ]内:dp[i][j]=mink=ijdp[i][k−1]+dp[k+1][j]+a[k]+b[i−1]+b[j+1] dp[i][j]=\min_{k=i}^{j}dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]
2021-02-13 14:27:23
140
原创 (环状区间dp)hdu 4745 Two Rabbits
题目hdu4745题意:输出环状数组的子序列(可以不连续)回文串的最长长度思路:把数组拉长一倍,在区间[ i ,j ]内:如果a [ i ] = a [ j ],则dp [ i ] [ j ] = dp [ i + 1 ] [ j - 1 ] + 2如果a [ i ] != a [ j ],则dp [ i ] [ j ] = max ( dp [ i + 1 ] [ j ], dp [ i ] [ j - 1 ] )有一种特殊情况,举个例子:环状数组是1,2,把数组拉长一倍是1,2,1,2
2021-02-13 11:53:30
97
原创 (区间dp) hdu 2476 String painter
题目hdu2476题意:给出字符串a和字符串b,你可以将字符串a的字符段更改为所需的任何其他字符。 输出字符串a更改为字符串b的最少次数。更改操作:举个例子,在字符串 qwer 中,可以在字符段[0, 2](即字符段qwe)更改为字符 z,即 qwer → zzzr思路:可以拆成两步,第一步是把空串更改为字符串b,第二步是根据第一步的结果推导出字符串a更改为字符串b空串更改为字符串b:在区间 i ~ j 内,如果字符串b [ i ] 在 区间 i+1 ~ j 内没有相同的字符,则dp [
2021-02-12 14:01:35
92
原创 (区间dp) hdu 4632 Palindrome subsequence
题目hdu4632题意:输出字符串中所有子序列回文串(可以不连续)的个数。as:aaa的所有子序列回文串是a(0),a(1),a(2),a(0)a(1),a(1)a(2),a(0)a(2),a(0)a(1)a(2) (括号里面的数字是这个字符在字符串中的坐标)思路:在区间i ~ j 中,如果a [ i ] != a [ j ],dp [ i ] [ j ] = dp [ i + 1 ] [ j ] + dp [ i ][ j - 1 ] - dp [ i + 1] [ j - 1]as:在
2021-02-11 00:59:40
97
原创 (区间dp)hdu 4283 You Are the One
题目hdu4283题意:一些人排队上场表演,第 k 个上场表演的人有 k - 1 * a[i] 的代价,有一个小黑屋(即栈),每个人可以进去小黑屋或直接上场表演,又或者是从小黑屋那里出去一个人上场表演(小黑屋是后进先出)。问如何合理利用小黑屋来以得到最小的代价。思路:在区间 i ~ j 内,a [ i ] 是第 k 个出场的,则区间 i+1 ~ i+k出场的代价 + a[i] * k + 区间 k+1 ~ j出场的代价 * (k+1)dp[i][j]=mink=ijdp[i+1][k]+dp[
2021-02-10 19:24:35
86
原创 (环状区间dp)hdu 3506 Monkey Party
题目hdu3506题意:环状石子合并思路:把数组拉长1倍 + 区间dp代码#include <iostream>#include <algorithm>#define DEBUG freopen("_in.txt", "r", stdin); freopen("_out1.txt", "w", stdout);using namespace std;const int MAXN = 2010;const int INF = 1e8;int a[MAXN],
2021-02-10 11:20:43
94
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人