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

    图形学很大程度上就是直接把数学表达式转换成代码。数学表达越清晰,对应的代码就越容易理解。

一、集合与映射

    映射,又称为函数,是数学及编程的基础。和程序中的函数类似,数学中的映射把属于某类型的自变量作为参数,映射为(返回)某特殊类型的对象。
    经常用到的集合包括:
    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、角
    以一点出发的两条射线形成一个角。角度定义为这两条射线   在单位圆周上截出的圆弧长度。一般规定用较短的弧长来表示角度,符号由两条射线的顺序来确定,这时所有弧度值都位于[-π,π].
    ![这里写图片描述](https://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)
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值