程序开发之数学知识汇总

在程序开发过程遇到的数学问题,将其原理记录下来,这样针对性的学习总结要比全部捡起,更有可行性、更靠谱!

  • 坐标系

为了表示位置,距离,方向等相关关系,使用三维的笛卡尔坐标系。

左手坐标和右手坐标系的鉴别方法:拇指食指中指分别代表xyz,指头方向为正方向。如果左手和当前坐标轴对应就是左手坐标系,反之为右手坐标系。上图为左手坐标系。

左手法则和右手法则,在左手坐标系里使用左手法则;在右手坐标系里使用右手法则。比如(0,0,1)在坐标系统中绕Y轴正方向旋转90度(旋转后坐标为(1,0,0)左右坐标系都一样),判断正方向的方法是在左手坐标系中,使用左手握住Y轴,4个指头指向的方向就是正方向。右手坐标系统则使用右手。

在unity3d中Vector3的forward,right,up在左手坐标系中,forward表示z轴的前方,right表示x轴正方向,up表示y轴正方向。(左手坐标系:右手指向x轴,头顶y轴,面向z轴)

  • 矢量运算

矢量与标量相乘除:KV = (KVx+ KVy+KVz)
矢量与矢量相加减:A + B = (Ax+Bx,Ay+By,Az+Bz),三角形法则如下图:

矢量的模:
单位矢量:模为1的矢量(归一化)
零矢量:V=(0,0,0)
矢量的点积公式一:
矢量点乘的几何意义:矢量b在单位矢量a上的投影

公式二:
矢量的叉积公式一:
公式二:

矩阵运算
矩阵与标量相乘:

矩阵与矩阵相乘:A(r行n列)乘以B(n行c列)得AB(r行c列),A的列数必须与B的行数相同
AB元素的值:A的i行矢量乘以B的j列矢量,公式为:

矩阵类型:
方阵(对角矩阵):行列相同
单位矩阵(I):MI=IM = M
转置矩阵:A(r行c列)转置为A(c行r列)
逆矩阵:必须为方阵(非零)MMMM = I  (M为逆矩阵)称为可逆的非奇异的否则称为不逆的,奇异的逆矩阵的逆矩阵为自己;I的逆矩阵为I;转置矩阵的逆矩阵是逆矩阵的转置;AB的逆等于B(逆)乘以A(逆)
正交矩阵:MMMM = I(M为转置矩阵),M(转置) = M(逆)
正交基:基矢量相互垂直
标准正交基:正交基的所有基矢量长度为1
行矩阵列矩阵:Unity中矢量是列矩阵的形式表示的,放在矩阵的右侧
矩阵 = 变换(旋转缩放平移)
线性变换:矢量加和标量乘(旋转,缩放,错切,镜像,正交投影)
仿射变换:合并线性变换和平移变换(非线性变换),4×4的矩阵表示,即齐次坐标空间


基础变换:仅平移,仅旋转,仅缩放


M(3×3)表示旋转和缩放,t(3×1)表示平移,0(1×3)零矩阵,右下角为标量1.
平移矩阵:

缩放矩阵:

k(x),k(y),k(z)相同为统一缩放,否则为非统一缩放

旋转矩阵:

复合变换:

从右向左,先缩放,再旋转,再平移(绝大多数情况下)
复合缩放:unity顺利zxy

  • 直线方程的公式有以下几种:
    斜截式:y=kx+b
    点斜式:y-y1=k(x-x1)
    两点式:(y-y1)/(x-x1)=(y-y2)/(x-x2)
    截距式:x/a+y/b=1
    一般式 点(x0,y0)到直线:Ax+By+C=0的距离:
    |AXo+BYo+C|/√(A²+B²)
    直线的方向向量:(1,k)
  • 点到直线的距离公式:
    formula
公式描述:公式中的直线方程为Ax+By+C=0,点P的坐标为(x0,y0)。
  • 负数的二进制
    负数以其正值的补码形式表示的,如:
    5的二进制:00000000 00000000 00000000 00000101
    5的二进制反码:11111111 11111111 11111111 11111010
    5的二进制补码:11111111 11111111 11111111 11111011 (反码加1)
  • [-1,1]映射到[0,1]:pixel = (normal +1)/2
  • 位运算符有:按位与、按位或、按位非、按位异或。
    与:& 都为1则为1
    或:| 有一个为1则为1
    非(取反):~ 按位取反
    异或:^ 不同为1(如1和0,0和1),相同为0(0和0,1和1)
    位运算的几个经典用途:
    1. 取x串中的低四位:x&0xF2. 将x串中低四位变成1,其他位不变:x|0xF
    3. 将x串中低四位取反:x^0xF
    4. 将x串的低四位变成0:x&~0xF
  • 中缀算式和后缀算式,原理?
    中缀:(3+X*Y)-2Y/3
    后缀:3 X Y * + 2 Y * 3 / –

  • 二叉树
    性质:
    1、非空二叉树的第n层上至多有2^(n-1)个元素。
    2、深度为h的二叉树至多有2^h-1个结点。

    遍历:

    前序遍历:根节点->左子树->右子树
    A B D G H E C K F I J
    中序遍历:左子树->根节点->右子树
    G D H B E A K C I J F
    后序遍历:左子树->右子树->根节点
    G H D E B K J I F C A

  • 右乘和左乘
    v1 = (x,y,z) 行矩阵1×3;v2 = (x,y,z)(v1的转置) 列矩阵3×1;
    左乘:工程数学中,用到两个矩阵相乘的时候,矩阵A×矩阵B,那么就称为A左乘以B。
    矩阵相乘才有左乘和右乘的区别
    矩阵左乘是行变换,右乘列变换
  • 求和公式
    自然数1..n求和:
    自然数n..m求和:
    等差求和:
    等比求和:

  • 速度,加速度,距离
    Vt:末速
    Vo:初速
    a:加速度
    S:位移
    t:时间
    等加速度五个公式,每个公式都取其中四个量来运算:(其中Vo^2=初速平方,以此类推)
    S=Vo^2+a(t^2)/2
    S=Vt^2+a(t^2)/2
    Vt=Vo+at
    S=(Vo+Vt)*t/2
    Vt^2=(Vo^2)+ 2aS
    斜抛的公式H=V^2 * sin^2 x / 2g
    T=2VsinX/g
    R=V^2 * sin2x /g
  • 四元数
    Quaternion = (xi + yj + zk + w ) = (x,y,z,w),(x,y,z) 跟旋转轴有关, w 与绕旋转轴旋转的角度有关,因为它们都要经过代数运算才能得出旋转轴和旋转角度
    在unity3d中, quaternion 的乘法操作 (operator  * ) 有两种操作:
    (1) quaternion * quaternion , 例如 q = t * p; 这是将一个点先进行t 操作旋转,然后进行p操作旋转.
    (2)  Quaternion * Vector3, 例如 p : Vector3, t : Quaternion , q : Quaternion;    q = t * p; 这是将点p 进性t 操作旋转;
    我进行的是第2种操作,即对一个向量进行旋转;
    首先 ,Quaternion 的基本数学方程为 : Q = cos (a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k(z * sin(a/2))    (a 为旋转角度)
    Q.w = cos (angle / 2)
    Q.x = axis.x * sin (angle / 2)
    Q.y = axis.y * sin (angle / 2)
    Q.z = axis.z * sin (angle / 2)
    我们只要有角度就可以给出四元数的四个部分值,例如我想要让点M=Vector3(o,p,q) 绕x轴顺时针旋转90度;那么对应的quaternion数值就应该为:
    Q : Quaternion;
    Q.x = 1 * sin(90度/2) = sin(45度) = 0.7071
    Q.y = 0;
    Q.z = 0;
    Q.w = cos(90度/2) = cos (45度) = 0.7071
    Q = (0.7071, 0 , 0 , 0.7071);
    m = Q * m;         (将点m 绕 x轴(1,0,0) 顺时针旋转了90度)

    这是quaternion 的最基本用法,主要给出角度,就可以算出Quaternion,然后对点坐标进行旋转。原文
未完