1.1.4 几何ADT
ADT(Abstract Data Type)抽象数据类型。它是指纯粹理论实体,不依赖于数据在计算机内部的表示方式和运算的具体实现方式。
在之前介绍了点、标量和矢量的各种概念、以及相对应的抽象空间。但是归根结底,最终还是要依赖于计算机来实现图形,那么我们必须介绍如何由这三种对象通过运算来构造各种几何对象以及如何实现这些对象之间的几何运算。我们希望这些运算是抽象的,是通用的而不是随着具体实现的不同而不同,因此,我们需要引入ADI的概念。
我们将要使用的符号:
希腊字母 α、β、γ...来表示标量
大写字母 P、 Q、 R...来表示顶点
小写字母 u、 v、 w...来表示向量
我们在目前还没有引入任何坐标系,因此向量和点的符号指的是抽象的对象,它们是泛指的一类对象,而不是这些对象在某个特定坐标系下的具体几何意义。
以下,我们再介绍以下仿射空间中的向量和标量之间的运算。
向量的长度:我们记向量的长度为 |v|。向量-标量乘法有如下的性质
|αv| = |α||v|
αv的方向取决于α的正负。
然后,我们再介绍一下点和点、点和向量之间的运算。
v = P - Q。它的具体的图形意义就是从Q到P的一条有向线段。
点和向量的加法可以由点点减法推导出来,表达的几何意义之前记录过。
向量的加法的几何意义最直观的理解便是三角形法则。
下面介绍由这三类对象如何通过对象的操作来创建出其他几何类型。
1.1.5 直线
我们用
P(α) = P0 + αd
来确定一条直线,并且随着a的改变,P(α)的意义也会改变。
P(α)表示的是一些点的集合。
当α能任意取时,那么P(α)所代表的集合意义就是一条直线。
当α只能去非负值或者非正值,我们就得到了一条射线。
当α在一个区间间变化时,我们就得到了一条线段。
1.1.6 仿射加法
我们定义仿射加法:
P = Q + αv
表示的是Q沿向量v方向所在直线上的所有点。
记v = R - Q 则
它还有另外一种表达形式:
P = α1R + α2Q
其中α1 + α2 = 1
1.1.7 凸性
如果一个对象中的任意两点,连接它们的线段上的所有点仍然在这个对象中,那么这个对象就是凸的。凸性对于图元的绘制具有很重要的作用。
上面我们定义了仿射加法,或者称为仿射和。对于α属于0到1的闭区间时,仿射和定义了连接Q 和 R的线段,显然它是凸的。我们拓展这个概念:
考虑如下形式:
P = α1P1 + α2P2 + α3P3 + .... + αnPn
数学归纳法得: α1 + α2 + α3 +....+αn = 1
如果满足αi>=0 i=1 2 3....那么由这n点仿射加法所定义的点集称为这个n个点的凸包。
一组平面上的点,求一个包含所有点的最小的凸多边形,这就是凸包问题了。这可以形象地想成这样:在地上放置一些不可移动的木桩,用一根绳子把他们尽量紧地圈起来,并且为凸边形,这就是凸包了。----百度百科
用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点
----百度百科
----百度百科
凸性的概念在设计曲线和曲面时非常有用。
1.1.8 点积和叉积
点积计算公式:
a·b = |a||b|cosα
几何意义:1.夹角 2.一个向量在另一个向量上的投影
叉积:
w = u×v
几何意义:在三维空间中,利用叉积都可以导出一个向量n使得n与u v都正交。
|u×v| = |sinα| ·|u||v| α为两者的夹角
1.1.9 平面
对于平面,我们要了解的是如何在仿射空间中去定义一个平面,即平面的参数形式,同时会介绍法向量以及质心坐标
在仿射空间中,推广直线的参数形式就可以得到平面(plane)的定义,具体推导如下:
我们已经知道不在一条直线上的三点能确定一个平面,那么我们记这三个点为P Q R
首先我们设想平面上的一条线段,起点为P 终点为Q,则由直线的参数方程,我们可以得到这条线段上点的几何的描述:
S(α) = αP + (1-α)Q,α属于0到1的闭区间。
然后,在这条线段上任取一点,我们记为S。并将S于直线外上的一点R连接起来构成一条线段,则线段SR上的点的集合可以表示为:
T(β) = βS + (1-β)R,β属于0到1的闭区间。
(其中P Q R依次连接起来可以构成一个三角形)
然后我们将两个等式合并起来:
T(α,β) = β{αP + (1-α)Q}+ (1-β)R,两个参数满足以上条件
然后,我们进行整理:
T(α,β) = αβP + β(1-α)(Q-P) + (1-β)(R-P)
记Q-P R-P分别为向量u v,并且二者不平行
则
T(α,β) = P0 + β(1-α)u + (1-β)v
那么我们发现,这个由三个不在一条直线上的顶点确定的平面可以 由一个顶点和两个不平行的向量来确定,在进一步的化简
T(α,β) = P0 + Xu +Yv
那么,以上的方程就是平面的参数形式,它反应出的核心问题就是一个平面可以由一个顶点和两个不平行的向量来确定
我们再次回到
T(α,β) = β{αP + (1-α)Q}+ (1-β)R
它等价于:
T(a,b,c) = aP + bQ + cR
其中a + b + c = 1
我们可用(a, b,c)来表示那个点,那么这个点就称为T(平面)关于P Q R 的质心坐标。
c表示的Z轴坐标。这只是推导定义,涉及到计算有另外的方法
并且,符合参数α β的点都在三角形P Q R内。
法向量(normal):我们记为n,它平面内任意向量都垂直。
总之:以上导出了在仿射空间中如何通过运算来表示平面,需要理解的就是一个平面的确定可以又一个顶点和两个不平行的向量确定。
2.2 三维图元
以上,我们介绍的都是二维上的图元,接下来介绍的是三维图元如何表示。
在三维的角度来看,我们又会涉及到很多之前在二维上不曾涉及到的几何对象,比如空间曲线,空间曲面,几何实心物体等等,但是现在的图形系统不能实现所有的三维对象,除非近似的表示。
对于图形系统能直接表示的那些图形,它们满足以下三个条件:
1.这些三维的对象可以用它们的表面来描述它们,并且认为它们是中空的:
2.这些对象可以由三维空间的一组顶点来确定
3.这些对象的表面可以由平面凸多边形组成或近似
要理解这三个条件,只需要理解现在的图形系统最适合进行什么样的处理:它们最适合绘制三角形或者三角形网格,图像系统的性能通常可以由给定的时间内画出的三维的三角形数目来度量。
条件一:意味着我们只需要二维图元就可以建模三维图元,因为表面是二维的不是三维的。
条件二:如果一个对象是由顶点来定义的,那么我们就可以通过流水线来高速处理这些顶点。
条件三:只有凸多边形来能方便图形系统来确定出一个平面来。非凸的难以确定。
总之,最常用的方式就是用多边形来近似表面进而近似整个三维图形的表面最终近似三维图形。
当然,除了这种方式,还有其他的近似方法比如构造实体几何。
2.3 坐标系和标架
在一个三维向量空间中,可以用任意三个线性无关的向量v1 v2 v3来把任意一个向量w表示出来。即:
w = αv1 + βv2 + γv3
其中前面三个参数是关于基向量v1 v2 v3的分量,我们也可以将其写成列矩阵的形式。
我们接下来过渡到它在某个坐标系下的具体表示:
通常认为以上的三个基向量确定了一个坐标系(coording system)。这三个基向量的起点我们通常画在同一处。这三个基向量确定了一组基,可以表示三维线性空间中的任何向量。并且另外的,由于向量是没有位置属性的,它只有大小和方向属性。因此,以下两个图在数学上表示的是同样的意思。
在仿射空间中,由于还有点的定义,接下来我们说明如何表示点。
只要我们在仿射空间中选取一个特定的参考点,那么我们就能够以一种明确的方式来表示所有的点。我们习惯上将三个基向量的起点作为那个参考点,我们称其为原点,这样的话我们可以表示点的同时也可以表示向量。
原点和基向量决定了一个标架(frame)
这样的话,我们可以唯一的表示向量:
w = α1v1 + α2v2 + α3v3
以及唯一的表示点:
p = p0(一般选为原点) + β1v1 + β2v2 + β3v3
通常使用标架的概念可以避免向量没有位置属性所带来的麻烦。
那么如何理解p = p0(一般选为原点) + β1v1 + β2v2 + β3v3呢,点和向量并不能画等号。正确的解释只需要变换一下
p - p0 = β1v1 + β2v2 + β3v3
将p0 看为起点 p 为终点,那么p - p0 可以理解为一条从参考点指向p的向量。
2.3.1 向量的表示
我们假设一个(三维)线性空间的基向量是一组单位基向量i j k,它们可以定义一组坐标系。
i j k通常可以写成(1,0,0) (0,1,0) (0,0,1)。
其他向量可以表示为
w = xi + yj + zk
那么由于i j k的形式,我们可以忽视它们,因此我们可以将向量写成一个三元组的形式(x,y,z),这个形式十分常用。
以上的记录涉及到的内容虽然是很常见的,但是还是需要系统的梳理以下,理解大致过程就好了,接下来涉及到的才是一些比较重要的知识。
查阅书籍:
交互式计算机图形学--基于 WebGL的自顶向下的方法
百度百科