您的位置:首页 > 理论基础

计算机图形学中的数学知识

2017-08-19 14:26 330 查看
图形学很大程度上就是直接把数学表达式转换成代码。数学表达越清晰,对应的代码就越容易理解。


一、集合与映射

映射,又称为函数,是数学及编程的基础。和程序中的函数类似,数学中的映射把属于某类型的自变量作为参数,映射为(返回)某特殊类型的对象。
经常用到的集合包括:
1、R:实数集合
2、R+:非负实数集合(包括0)
3、R²:二维平面上的实数有序对集合
4、Rn:n维笛卡尔空间中的点集合
5、Z:整数集合
6、S²:单位球面上的三维点集合(R³中的点)
用箭头和冒号表示集合则如下所示:
f:R→Z
上式表达:存在一个函数f,可以将输入的实数映射成一个整数。而编程人员更喜欢这样的等价描述:存在一个函数f,它具有一个实数类型参数,并返回一个整数。即:
integer f(real) <⇒ f:R→Z


二、解二次方程

二次方程具有以下形式:
Ax2+Bx+C = 0
其中x是一个未知数,通过配方可以解得:
x=(-B±sqrt(B²-4*AC))/2*A
决定实数解个数的因子是:
D==B²-4*AC
如果D>0,则有两个实数解,D=0则有一个实数解,D<0没有实数解


三、三角学

图形学中的很多情况要用到基本的三角知识,三角知识可以帮我们记忆基本定义。
1、角
以一点出发的两条射线形成一个角。角度定义为这两条射线   在单位圆周上截出的圆弧长度。一般规定用较短的弧长来表示角度,符号由两条射线的顺序来确定,这时所有弧度值都位于[-π,π].
![这里写图片描述](http://img.blog.csdn.net/20170809233944356?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHRhbjEyMTUyMjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
每个角度都是两条射线在单位圆周上切出的圆弧的长度。
2、三角函数
已知一个直角三角形,根据毕达哥拉斯定理有以下等式:
a²+b²=c²
定义角α的正弦、余弦以及其他三角函数如下
sinα = b/c
cscα = c/b
cosα = a/c
secα = c/a
tanα = b/a
cotα = a/b
注意:在计算机图形学中经常约定逆时针旋转为正方向。
三角函数是周期函数,多个自变量值对应同一个函数值,这 就意味着这些函数在实数域R内是不可逆的。为了使三角函数可逆,必须对取值范围进行限制。定义域和值域规定为:
asin:[-1,1]→[-π/2,π/2]
acos:[-1,1]→[0,π]
atan:R→[-π/2,π/2]
atan2:R→[-π,π]
最后一个函数atan2(s,c)是非常有用的。其中s与sinA成正比,c与cosA成正比,且比例因子相同,atan2(s,c)的函数值为A。假使该比例因子为整数,其中的一种理解方式为,函数返回极坐标下二维笛卡尔点(s,c)的角度。
3、三角函数公式
在此列出各种有用的三角函数公式。
诱导公式:
sin(-A) = -sinA
cos(-A) = cosA
tan(-A) = -tanA
sin(π/2-A) = cosA
cos(π/2-A) = sinA
tan(π/2-A) = cotA
毕达哥拉斯公式:
sin²A + cos²A = 1
sec²A - tan²A = 1
csc²A - cot²A = 1
和差公式:
sin(A+B) = sinAcosB + cosAsinB
sin(A-B) = sinAcosB - cosAsinB
sin(2A) = 2sinAcosA
cos(A+B) = cosAcosB - sinAsinB
cos(A-B) = cosAcosB + sinAsinB
cos(2A) = cos²A - sin²A
tan(A+B) = (tanA+tanB)/(1-tanAtanB)
tan(A-B) = (tanA-tanB)/(1+tanAtanB)
tan(2A) = (2tanA)/(1-tan²A)
半角公式:
sin²(A/2) = (1-cosA)/2
cos²(A/2) = (1+cosA)/2
积化和差公式:
sinAsinB = -(cos(A+B)-cos(A-B))/2
sinAcosB = (sin(A+B)+sin(A-B))/2
cosAcosB = (cos(A+B)+cos(A-B))/2
对于变长为a,b,c 对应角分别为A,B,C的任意三角形,下列公式都成立:
sinA/a = sinB/b = sinC/c(正弦定理)
c² = a²+b²-2abcosC(余弦定理)
(a+b)/(a-b) = tan((A+B)/2)/tan((A-b)/2)(正切定理)
三角形的面积同样可以通过三条边长表示出来:
s = sqrt((a+b+c)(-a+b+c)(a-b+c)(a+b-c))/2


四、向量

向量包含长度和方向,可以用一个箭头表示。若两个向量方向和长度相同,则两个向量相等。
1.向量运算
向量的加法遵守平行四边形法则。求和时,把一个向量的箭头尾部与另一个向量的箭头相连,和向量与参与运算的两个向量构成一个完整的三角形。向量加法满足交换律:
**a+b = b+a**
向量减法
**b-a ≡ -a+b**
2.向量的笛卡尔坐标
任意一个二维向量可以有两个互不平行的非零向量组合而成。这两个向量所具有的这种性质成为线性独立。线性独立的两个向量就构成了一个二维基,这两个向量称为基向量
3.向量点积
两个向量相乘的最简单方式是点积。向量a和b的点积用a*b表示,通常称之为标量积。向量的点积跟与两个向量的长度和它们之间的夹角有关:
a*b = |a|*|b|cosα
在图形程序中,一般通过点积计算两个向量间夹角的余弦值。
也可以通过点积求一个向量到另一个向量的投影,投影长度a→b为:
a→b=|a|cosα=(a*b)/|b|
如果二维向量a和b以笛卡尔坐标形式表示,则可以利用x*x=y*y=1 以及 x*y = 0推断出:
a*b = x1*x2 + y1*y2
4.向量叉乘
叉乘axb常用于三维向量。叉乘axb返回一个三维向量,该向量与另外两个向量a和b都是正交的。叉乘得到的结果向量,其长度与sinα相关:
|axb|=|a||b|sinα
|axb|等于两向量a和b形成的平行四边形的面积。
叉乘向量的方向只有两种可能,定义x、y、z轴上的方向向量为:
x = (1,0,0)
y = (0,1,0)
z = (0,0,1)
以上三个单位向量的所有叉乘如下:
x x y = +z
y x x = -z
y x z = +x
z x y = -x
z x x = +y
x x z = -y
根据sinα的性质,我们知道一个向量与它本身的叉乘结果为零向量,即:x x x = 0.注意叉乘不满足交换律。
5.标准正交基与坐标系
建立坐标系是几乎任何图形学程序的核心任务之一。这一任务的关键就是计算标准正交基。对于任意两个向量u和v,只要它们是正交的,并且它们的长度为单位长度,那么它们就构成了一对标准正交基,于是有:
|u| = |v| = 1;  u * v = 0
在三维空间中,三个向量u、v和w如果满足一下条件,它们就构成一组标准正交基:
|u| = |v| = |w|; u*v = v*w = w*u = 0
如果w=uxv,那么这个标准正交基满足右手法则,否则就满足左手法则。
5.从单向量建立正交基
经常需要从单个向量构造一组标准正交基,也就是说,已知一个向量a,需要找出一组标准正交向量u、v、w,使得w的指向和向量a的方向相同。具体求解过程如下:
w = a/|a|
为了求u和v,需要找到一个与w不共线的向量t。为此,只要让t等于w,再将其中绝对值最小的元素变为1即可。例如,如果w=(1/ sqrt(2), 1/sqrt(2), 0),则t=(1/ sqrt(2), 1/sqrt(2), 1)。于是u和v很容易求出:
u=(t x w)/|t x w|
v = w x u


五、二维隐式曲线

直观上,一条曲线就是可以在纸上一笔画出的点的集合。表示曲线的一般方法是使用隐式方程。隐式方程具有如下形式:
f(x,y) = 0
1.二维梯度
如果我们把函数f(x,y)看成高度f(x,y)的高度图,那么梯度向量就指向坡度最大的方向。梯度向量▽f(x,y)由下式给出:
▽f(x,y) = (∂f/∂x,∂f/∂y)
隐式曲线f(x,y)=0上,某点处的梯度向量与曲线在该点处的切向量正交。该梯度向量一般称为曲线的法向量。此外,因为梯度指向上坡的方向,它就指明了f(x,y)>0的区域的方向。
2.隐式二维直线
我们熟悉的直线"斜切式"为:
y = mx+b
可以很容易地把它转换为隐含式:
y-mx-b = 0
这里m是斜率,b是直线穿过y轴时的y值,通常称为y截距。
在不改变方程零点的情况下,可以对隐式方程两边同时乘以一个常量。对于任意非零k,kf(x,y)=0与f(x,y)=0是同一条相同的曲线。
3.隐式二次曲线
对于二维二次曲线,也就是椭圆和抛物线,以及特殊的双曲线、圆和直线,都可以用一个通用的隐形式来表示:
Ax²+Bxy+Cy²+Dx+Ey+F = 0
对于圆心为(xc,yc)、半径为r的圆来说,上式变为:
(x-xc)²+(y-yc)-r² = 0
如下是抛物线方程:
y-k(x-xc)² = 0
其中k是一个非零常数,xc是抛物线的对称轴。对称轴与坐标轴平行的椭圆方程为:
(x-xc)²/a²+(y-yc)²/b² = 0
其中(xc,yc)是椭圆的中心,a和b分别是椭圆的长、短半轴的长度。
六、二维参数曲线
参数曲线通过一个参数进行控制,该参数可以看做沿曲线连续运动的指针。这样的曲线具有以下形式:
(x,y) = (g(t), h(t))
其中(x,y)是曲线上的一点,t就是影响曲线的参数。
1.二维参数直线
在二维空间中,通过两点p0=(x0,y0)和p1(x1,y1)的直线参数方程课表示为:
(x,y)=(x0+t(x1-x0), y0+t(y1-y0))
因为公式中的x和y具有类似的结构,我们可以采用向量形式p=(x,y)表示:
p(t) = p0+(p1-p0)t
2.二维参数圆
对于圆心为(xc,yc)、半径为r的圆,其参数形式为:
(x,y) = ((xc+r*cosα),(yc+r*sinα))
为了保证曲线上的每点只对应唯一的参数α,可以将α的范围限制在[0,2π)、(-π,π]或者其他长度为2π的半开区间内。
调整x,y表达式中的系数,就可以写出对称轴与坐标轴平行的椭圆参数方程:
(x,y) = ((xc+a*cosα),(yc+b*sinα))


七、三维隐式曲面

隐式方程隐式的确定了曲面上点的集合:
f(x,y,z) = 0
曲面上的任意一点(x,y,z)将使f的值为零,不在曲面上的点将返回非零值。
1.隐式曲面的法向量
在光学计算中会用到曲面的法向量,也就是垂直于曲面的向量。曲面上的每个点都对应独自的法向量。交叉点p处的曲面法向量由隐式函数的梯度给出:
n=▽f(p)=(∂f(p)/∂x, ∂f(p)/∂y, ∂f(p)/∂z)
梯度向量可以指向曲面内侧,也可以指向曲面外侧。如果某个f的梯度指向曲面的内侧,而我们希望梯度指向曲面的外侧,那么就采用-f(p)=0的形式。曲面f(p)=0与-f(p)=0相同,只是二者的梯度方向相反,也就是 ▽f(p)=-▽(-f(p))
2.隐式平面
作为一个例子,考虑过点a、法向量为n的无线平面。该平面的隐式方程表示为:
(p-a)*n = 0
其中a和n都是已知的量。点p是满足方程的点。该方程的几何意义是:从a到p的向量与平面的法向量垂直。如果p不在平面内,那么(p-a)就不与n成直角。
有时需要建立过三点a、b、c的平面方程。可以通过求平面上任意量向量的叉乘来求平面的法向量:
n=(b-a)x(c-a)
那么平面的隐式方程可写为:
(p-a)*((b-a)x(c-a)) = 0
该方程的几何意义是:由p-a、b-a、c-a定义的平行六面体的体积为零,也就是说这三个向量共面。


八、三维参数曲线

三维参数曲线的表示形式与二维参数曲线类似:
x = f(t)
y = g(t)
z = h(t)
例如,绕z轴的螺旋线方程是:
x = cost
y = sint
z = t
三维参数直线
三维直线参数的向量表示形式为:
p = o + td
其中,o和d是向量。


九、三维曲面参数

另一种方法是通过二维参数确定三维曲面,具有以下形式:
x = f(u,v)
y = g(u, v)
z = h(u, v)
参数球面
地球表面上的一点由精度和纬度确定。如果把极坐标系置于半径为r的球体上,球心在原点,就得到球面的参数方程:
x = r*cosα*sinγ
y = r*sinα*sinγ
z = r*conγ
已知某组(x,y,z),我们还想求出对应的(α,γ)。假设α∈(-π,π],利用atan2函数很容易求出
γ = acos(z/sqrt(x²+y²+z²))
α = atan2(y,x)


十、线性插值

图形学中最长运用到的数学运算可能就是线性插值了。由两点a、b构成的以参数t为参数的直线形式为p=(1-t)a+tb,这就是插值,因为当t=0和t=1时,p正好通过a和b。


十一、三角形

无论是二维情况还是三维情况,三角形都是图形学程序中的基本图形。一般像颜色这样的信息标记在三角形的顶点上,并被插值到三角形中。实现这种插值的坐标系称为重心坐标系。
1.二维三角形
在图形学中,经常希望为三角形的每个顶点赋以性质,如颜色,并将该性质的值插值到三角形中。实现这种要求有多重方法,其中最简单的方法就是利用重心坐标系。以坐标a为原点,从a到b和从的向量为基向量。于是点p就可以表示为:
p = a + β*(b-a) + γ*(c-a)
整理上式得到:
p = (1-β-γ)*a + β*b + γ*c
经常定义一个新的变量α,以改善方程的对称性:
p(α,β,γ) = α*a + β*b + γ*c
其中α+β+γ = 1
重心坐标系由平面上的所有点确定。重心坐标系的一大特点是,对于由a、b、c构成的三角形,当且仅当下列条件满足时,点p位于三角形内部:
0<α<1
0<β<1
0<γ<1
如果其中一个坐标为零,而其他两个坐标位于0和1之间,那么改点位于三角形边上。如果有两个坐标为0,则剩下的一个为1,则该点位于顶点。
2.三维三角形
三角形的重心坐标可以扩展到三维空间。假设a、b、c是三维点,我们仍然可以使用下式:
p=(1-β-γ)*a+β*b+γ*c
现在,通过改变β和γ,形成一个平面。
计算三角形所在平面的任意两个向量的叉乘,就可以得到三角形的法向量。用三角形的两边构造这样的向量最方便,例如:
n=(b-a)*(c-a)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息