计算机图形学(二)输出图元_6_OpenGL曲线函数_1_圆生成算法

OpenGL曲线函数

生成圆和椭圆等基本曲线的函数并未作为图元功能包含在OpenGL核心库中。但该库包含了显示Bezier样条的功能,该曲线是由一组离散点定义的多项式。OpenGL实用库(GLU)中包含有球面和柱面等三维曲面函数以及生成B样条的函数,它是包含简化Bezier曲线的样条曲线的总集。我们可以使用有理B样条显示圆、椭圆和其他二维曲线。此外,OpenGL实用工具包(GLUT)中还有可以用来显示某些三维曲面(如球面、锥面和其他形体)的函数。然而,所有这些函数比本章中介绍的基本图元应用得更多,因此我们将在第7章进一步讨论这一组函数。

我们还可以使用折线来近似地显示简单曲线。仅需确定一组曲线上的点并将它们连接成一组直线段。折线中的线段越多,曲线越平滑。图3.15给出了用于表示弧的几种折线显示。

第三种可选方法是按下面将给出的算法写出自己的曲线生成函数。首先讨论生成圆和椭圆的高速算法,然后再看一个生成其他二次曲线、多项式和样条曲线的函数。

圆生成算法

由于圆是图形中经常使用的元素,因此在大多数图形软件中都包含生成圆和圆弧的函数。这些软件有时也会提供一个能显示包括圆和椭圆在内的多种曲线的通用函数。

圆的特性

我们将圆定义为所有距中心位置(xc,yc)为给定值r的点集(参见图3.16 )。对于任意的圆点(x,y),这个距离关系可用笛卡儿坐标系中的勾股(Pythagorean)定理定义为

利用这个方程,我们可以沿x轴从xc-r到xc+r以单位步长计算对应的y值,从而得到圆周上每点的位置:

但这并非是生成圆的最好方法。这个方法的一个问题是每一步包含很大的计算量。而且,如图3.17所示,所画像素位置间的间距是不一致的。我们可以在圆斜率的绝对值大于1后,交换x和y(即步进y值并计算x值)来调整间距。但是,这种方法增加了算法所需的计算量和处理过程。

另一种消除图3.17中不等间距的方法是使用极坐标r和θ(参见图3.16)来计算沿圆周的点。

以参数极坐标形式表示圆方程,可以得到方程组:

使用上述方法以固定角度为步长生成显示结果时,就可以利用沿圆周的等距点来绘制出圆。为了减少计算量,我们可以在相邻点间使用较大的角度间隔并用线段连接相邻点来逼近圆的路径。在光栅显示中设定角度间隔为1/r可获得较连续的边界。这样绘出的像素位置大约间隔一个单位。尽管极坐标系统提供了等距点,但三角函数计算是十分耗时的。

对于上述任何一种圆生成算法,考虑圆的对称性可以减少计算量。圆的形状在每个象限中是相似的。因此,如果我们确定了在第一象限中圆的位置,则可以生成该圆在xy平面中第二象限的部分,这是因为两个圆弧段对于y轴是对称的。考虑对于x轴的对称性,根据第一和第二象限中的圆弧可以得到第三和第四象限的圆弧。在八分圆之间也有对称性,因此可以进一步细化,一个象限内的相邻八分圆的圆弧对于分割两个部分的45度直线是对称的。这种对称情况可参见图3.18,图中八分之一圆上的一点(x,y)将映射到xy平面的其他七个八分圆的点。这种方法利用了圆的对称性,仅需计算从x=0到x
= y分段内的点就可得到整个圆的所有像素位置。在这个八分圆中,圆弧斜率绝对值小于或等于1.0 。x = 0时圆的斜率是0,而当x = y时圆的斜率是-1.0。

使用对称性及方程(3.26)或方程(3.28)来确定圆周上的像素位置,仍然需要大量的计算时间。笛卡儿方程(3.26)包括乘法和平方根运算,而参数方程中包含乘法和三角运算。更有效的画圆算法是如同Bresenham画线算法一样以决策参数的增量计算为基础,这样仅仅包括简单的整数处理。

通过设定在每一取样步骤中寻找最接近圆周像素的决策参数,可以将光栅系统的Bresenham画线算法移植为画圆算法。然而,圆方程(3.26)是非线性的,计算像素与圆的距离必须进行平方根运算。Bresenham画圆算法则通过比较像素与圆的距离的平方而避免了平方根运算。

然而,不做平方运算而直接比较距离是可能的。该方法的基本思想是检验两像素间的中间位置以确定该中点是在圆边界之内还是之外。这种方法更易应用于其他圆锥曲线,并且对于整数圆半径,中点方法生成与Bresenham画圆算法相同的像素位置。而且使用中点检验时,沿任何圆锥截面曲线所确定的像素位置,其误差限制在像素间隔的1/2以内。

时间: 2024-12-28 20:29:36

计算机图形学(二)输出图元_6_OpenGL曲线函数_1_圆生成算法的相关文章

计算机图形学(二)输出图元_6_OpenGL曲线函数_3_椭圆生成算法

椭圆生成算法 非严格地说,椭圆是拉长了的圆.还可以说椭圆是经过修改的圆,它的半径从一个方向的最大值变到其正交方向的最小值.椭圆内部这两个正交方向的直线段称为椭圆的长轴和短轴. 椭圆的特征 通过椭圆上任一点到称为椭圆焦点的两个定点的距离可给出椭圆的精确定义:椭圆上任一点到这两点的距离之和都等于一个常数(参见图3.21 ).如果椭圆上的任一点P = (x,y)到两个焦点的距离为d1和d2,那么椭圆的通用方程可以表示为 用焦点坐标F1=(x1,y1)和F2 = (x2,y2)来表示距离d1和d2,可以

计算机图形学(二)输出图元_6_OpenGL曲线函数_4_中点椭圆算法(上)

中点椭圆算法(上) 这里的方法类似于显示光栅圆.给定参数rx,ry和(xc,yc),首先确定以原点为中心的标准位置椭圆上的点(x,y),然后将这些点平移到以(xc,yc)为中心的椭圆上.如果希望显示不在标准位置的椭圆,那么就绕中心坐标旋转并对长轴和短轴重新定向.但目前仅考虑显示标准位置的椭圆,第4章将讨论变换对象方向和位置的通用方法. 中点椭圆算法将分成两部分应用于第一象限.图3.25给出了依据rx<ry的椭圆斜率对第一象限进行的划分.并通过在斜率绝对值小于1的区域内在x方向取单位步长,以及在斜

计算机图形学(二)输出图元_6_OpenGL曲线函数_5_其他曲线

其他曲线 许多曲线函数在对象建模.动画轨迹的描述.数据和函数的图形化以及其他图形应用中是十分有用的.常见的曲线包括圆锥曲线.三角和指数函数.概率分布.通用多项式和样条函数.这些曲线的显示可采用类似于前面讨论的圆和椭圆函数来生成.沿曲线轨迹的位置可直接从表达式y =f (x)或参数方程中得到.此外,还可以使用增量中点算法绘制用隐式函数f(x,y) = 0描述的曲线. 显示一指定的曲线函数的简单方法是使用直线段来逼近曲线.这时,对于要得到沿曲线轨迹的等距线段的端点位置,则可以使用参数表达式.也可以按

计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

中点画圆算法 如同光栅画线算法,我们在每个步中以单位间隔取样并确定离指定圆最近的像素位置.对于给定半径r和屏幕中心(xc,yc),可以先使用算法计算圆心在坐标原点(0, 0)的圆的像素位置,然后通过将xc加到x且yc加到y.从而把计算出的每个位置(x,y)移动到其适当的屏幕位置.在第一象限中,圆弧段从x = 0到x = y,曲线的斜率从0变化到-1.0.因此,可以在该八分圆上的正x方向取单位步长,并使用决策参数来确定每一步两个可能的y位置中,哪一个更接近于圆的位置.然后,其他七个八分圆中的位置可

计算机图形学(二)输出图元_16_字符函数

OpenGL 字符函数 OpenGL基本库仅为显示单个字符和文字串提供了基本的支持.我们可以定义图3.61中的位图字符,并将一个位图集作为字库存储.一个文字串通过将从字库中选择的位图序列映射到帧缓存的 相邻位置来显示. 但是,OpenGL实用函数工具包(GLUT)中有一些预定义的字库.因此我们不用创建自己的位图字型库,除非需要显示GLUT中没有的字体.GLUT子程序可显示位图和轮廓字体.GLUT位图字体由OpenGL的glBitmap函数来绘制,而轮廓字体由折线边界(GL_LINE_STRIP)

计算机图形学(二)输出图元_18_显示列表_1_创建和命名OpenGL显示表

OpenGL显示列表 把对象描述成一个命名的语句序列(或任何其他的命令集)并存储起来既方便又高效.在OpenGL中使用称为显示表(display list)的结构可以做到这一点.一旦建立了显示表,就可以用不同的显示操作来多次引用该表.在网格中,描述图形的显示表存放在服务器中,以避免每次显示场景时都要传送表中的命令.我们可以为以后的执行来建立并存储显示表,或指定表中的命令立即执行.显示表对层次式建模特别有用,因为一个复杂的对象可以用一组简单的对象来描述. 创建和命名OpenGL显示表 使用glNe

计算机图形学(二)输出图元_20_章节总结(上)

输出图元章节总结 发了好久第2章终于结束了,本章中讨论的输出图元为使用直线.曲线.填充区域.单元阵列样式和文本构造图形提供了基本的工具.我们通过在笛卡儿世界坐标系统中给出几何描述来指定图元. 用于沿线段路径绘制像素的三种方法是DDA算法.Bresenham算法和中点算法,Bresenham算法和中点算法是等同的并且是最有效的.沿线段路径的像素的颜色位存储按照递增地计算内存地址的方式而有效完成.任何线段生成算法都可以通过分割线段并将分割的线段分布到可用处理器上来获得并行的实现. 圆和椭圆采用中点算

计算机图形学(二)输出图元_10_多边形填充区_1_多边形分类和识别

多边形填充区 一个多边形(polygon)在数学上定义为由三个或者更多称为顶点的坐标位置描述的平面图形,这些顶点由称为多边性的边(edge或者side)顺序连接.进一步来看,几何上要求多边形的边除了端点之外没有其他公共点.因此,根据定义,一个多边形在其单一平面上必须有其所有的顶点且边之间无交叉.多边形的例子有三角形.矩形.八边形和十六边形等.有时,任一有封闭折线边界的平面图形暗指一个多边形,而若其没有交叉边则称为标准多边形(( standard polygon)或简单多边形( simple po

计算机图形学(二)输出图元_3_画线算法_3_Bresenham画线算法

Bresenham画线算法 本来在word中是有右下数的,一编辑在csdn中编辑就没有了.                         Bresenham画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用增量整数计算.另外Bresenham算法还可用于显示圆和其他曲线.图3.8和图3.9给出了绘制线段的屏幕局部.垂直轴表示扫描线位置,水平轴标识像素列.在这个例子中,我们以单位x间隔取样,并且需要确定每次取样时两个可能的像素位置中的哪一个更接近于线路径.从图3.