vector
- 向量和
- 首尾加法 箭头形式的向量加法,在一个方向上移动了一段距离,在另一个方向上又移动了一段距离,表示移动的整体距离
- 向量平移
- x分量和y分量
- 向量长度 sqrt(x^2+y^2)
5v 标量乘法
-1*v 负向量 减法:向量和负向量的加法
位移是一个向量(带方向),距离是一个标量。距离不足以说明如何从点A到点B。
极坐标:给定向量长度和角度(从x轴正半轴逆时针旋转的角度),如(5, 37度)。
平常度(x,y)坐标 如(3,4)为笛卡尔坐标。 极坐标和笛卡尔坐标可以互现转换。
正切: 给定一个角度,该角度上向量的y,x坐标有一个固定比值。
$\tan(\theta)$
正弦:向量的垂直距离与距离的比值
$\sin(\theta)$
余弦:向量的水平距离与距离的比值
$\cos(\theta)$
弧度:半径为1的圆,圆心角对应的圆边的长度。
$\pi$ 弧度 =$180^\circ$
弧度和距离都是正数哈。
python里也实现了可以根据三角函数值求出弧度的方法。
math.asin (不是唯一解)
math.acos (不是唯一解)
math.atan2 接受笛卡尔坐标(按相反的顺序),返回对应的弧度
笛卡尔坐标适合向量移动,极坐标适合向量旋转
在极坐标体系中,角度的相加会使向量逆时针旋转,角度的相减会使向量顺时针旋转。
重要操作
-
平移
-
缩放
-
旋转
通常以不同的顺序应用旋转和平移,结果不同。
对一个向量集合都应用相同的变换,可以达到变换图形的效果,是非常重要的思想。
(x,y,z) 用箭头和点在三维空间中充当向量的心智模型。
跟二维一样,把所有向量的x坐标、y坐标、z坐标分别相加。
zip和sum函数的运用
v = (1,2,3) 2*v = (2,4,6)
v-w 从w到v的位移向量
sqrt(sum([coord ** 2 for coord in v]))
三维向量可以看作箭头,或沿着一定方向发生的一定长度的位移。
在二维空间中,两个数足以指定任何而为乡里那个(一个长度和一个角度-极坐标,指明方向); 但在三维空间中,一个角度不足以指明方向,但两个可以。
球坐标 (r,
向量乘法的一种,取两个向量相乘,返回一个标量。
二维和三维空间中,这些几何性质都适用: (双向点)
- 两个向量夹角小于90度,点积为正
- 两个向量相互垂直,点积为0
- 两个向量夹角大于90度,点积为负,且越长积越小,即负值越大
将对应点坐标分别相乘,然后求和。
将任意一个向量scale,点积也会翻倍。
- 向量越长,点积绝对值越大
- 两个长度为a和b的向量点积范围为: -|ab| ~ |ab|
还有另一个计算点积的公式
u
$\cdot$ v = |u|$\cdot$|v|$\cdot$$\cos$ ($\theta$ )
我们通过向量长度和点积,可以反推出向量的夹角。
向量乘法的另一种,取两个向量相乘,返回另一个向量。
-
向量积可以判定朝向
-
向量积垂直于2个输入向量,符合右手规则
u、v 和 u
$\times$ v 构成右手系,食指指向u,三指弯向v,拇指指向向量积 -
向量积在二维空间无意义
两个输入向量u和v,向量积的长度代表u和v构成的平行四边形的面积。
u和v垂直时候面积最大,u和v同方向则不存在唯一垂直方向,向量积长度为0(最终的向量长度也为0)
u * v *
$\sin$ ($\theta$ )
u和v两个向量
u
$\times$ v = (uy * vz - uz * vy, uz * vx - ux * vz, ux * vy - uy * vx)
向量变换:
-
平移
-
缩放
-
旋转
-
线性变换
向量随着时间变化。
使用更先进的图形绘制库OpenGL - PyOpenGL和pygame
pygame
PyOpenGL
def transform(v):
old_x, old_y, old_z = v
# 此处做一些操作
return (new_x, new_y, new_z)
运行源代码中Chapter 04下的draw_teapot.py
三维向量变换的唯一要求是,接收一个单独的三维向量作为输入,并返回一个新的三维向量作为输出。
-
缩放 scale2.py
-
平移 shiftt_1.py
画图
可以既缩放又移动,把标量乘法、平移等操作叠加。
向量变换以向量为输入输出,可以通过函数组合来组合任意的向量。
柯里化(currying) 接收多个输入的函数重构为返回另一个函数的函数。
按照系数-1缩放,是得到镜像,慎用。
绕哪个轴旋转,哪个轴的坐标就不变。 可以应用这个,对三维向量的另2个坐标应用二维旋转函数。
-
转换成极坐标
-
逆时针旋转角度
-
转化为笛卡尔坐标
组合函数
compose(f,g,h)(x) = f(g(h(x)))
对于任意输入向量u和v,
T(u) + T(v) = T(u+v)
对于任意标量s和向量v,有:
T(sv) = sT(v)
T是线性变换的数学表示。
线性变换是一种well-behaved的向量变换,保持了向量的
-
向量和
-
标量乘积
-
线性组合
非零向量的平移不是线性变换!
线性组合:
向量u和v,3u-2v是u和v的线性组合。
向量u和v之间线段的中点,也是0.5u + 0.5v的尾巴节点。即T(1/2u+1/2v) = 1/2T(u) + 1/2T(v)
0.25u + 0.75v也在u和v之间的线段上。在从u到v的路径上的75%处。
两个向量u和v之间线段上的每个点都是形如 su + (1-s)v的"加权平均值",其中s介于0和1之间。
线性变换T将u和v的加权平均值转化为T(u)和T(v)的加权平均值。
T(s$\cdot$u + (1-s)$\cdot$v) = s$\cdot$T(u) +(1-s)$\cdot$T(v)
可以预见,线性变换可以保持三维模型的结构。
两个线性变换的组合也是线性的。
(1,0,0) (0,1,0),(0,0,1)这三个向量。分别表示为e1,e2,e3
(3,4,5) = 3e1+4e2+5e3
当然二维向量也适用,(1,0) (0,1)
所有线性变换都可以表示为e1、e2和e3的线性组合。
2d
v=(3,2)
T(v) = T(3e1+2e2) = 3T(e1) + 2T(e2)
3d
A是一个线性变换,A(e1)=(1,1,1), A(e2)=(1,0,-1), A(e3)=(0,1,1)
如果v=(-1,2,2),那么A(v)是什么?
A(v) = A(-e1+2e2+2e3)=-A(e1) + 2A(e2) + 2A(e3) = (1, 1, -1)
在任意维中,线性变换的行为由一个向量列表或数组阵列来规定 - 矩阵