计算机图形学(二)输出图元_4_并行画线算法

并行画线算法

本来在word中是有右下数的,一编辑在csdn中编辑就没有了。

 
                        

上面讨论过的线段生成算法顺序地确定像素位置。而利用并行计算机,则可通过将计算分割到可用的多个处理器中来得到线段的像素位置。分割问题的一种解决方法是将现有的顺序算法放到多个处理器上。我们也可以寻找其他处理办法,从而使像素位置能以并行方式有效地计算。在设计并行算法中,重要的是要考虑平衡可用处理器间的处理负载。

给定np个处理器,我们可以通过把线段分割成np个子段,并在每个子段中同时生成线段而建立起并行的Bresenham画线算法。对于斜率为0 < m < 1.0且左端点坐标位置为(xo,yo)的线段,我们沿正x方向对线段进行分割。相邻分段的起始x位置间的距离可计算为

其中,△x是线段的水平宽度,分段水平宽度△xp的值利用整数除法来计算。将分段和处理器从0,1, 2直到np- 1编号,可以计算出第k分段的起始的、坐标为

例如△x = 15,并且具有np = 4个处理器,那么分段的水平宽度是4,各分段的初始x值为xo 、xo +4、xo +8 , xo + 12。对于这种分段策略,有些情况下最后(最右边)的子段会比其他段小。此外,假如线段的端点不是整数,舍入误差将导致沿线的长度产生宽度不同的分段。为了将Bresenham算法用于各分段,需要有每个分段的y坐标初始值和决策参数的初始值。分段y方向的变化△y,可从线段斜率m和分段宽度△xp计算得出:

那么,第k分段的起始y坐标为

第k分段起始处Bresenham算法的初始决策参数可从等式(3.14)中得到

然后,各处理器利用该分段的初始决策参数值和起始坐标(xk,yk),计算指定的分段上的像素位置。我们也可以通过替换m = △y/△x和重新安排有关项,将yk和pk起始值计算中的浮点运算简化为整数运算。在y方向对线段进行分段并计算分段的起始x值,可以将并行Bresenham算法拓展到斜率大于1.0的线段。对于负斜率,则可以在一个方向递增坐标值,而在另一方向上递减。

建立光栅系统并行算法的另一种方法是,为每个处理器分配一组屏幕像素。只要具有足够数量的处理器,就可以将每个处理器分配给某个屏幕区域内的一个像素。这种方法可以通过为一个处理器分配线段坐标范围之内的一个像素并计算像素距线段的距离而移植成线段显示的方法。在线段的包围盒中的像素数目为△x.△y, (参见图3.13 )。在图3.13中,从线段到坐标(x, y)处像素的垂直距离d,可以利用下列算式得到:

其中

并且

一旦估算出线段的常量A, B和C,那么每个处理器只需完成两次乘法和两次加法来计算像素距离d。如果d小于指定的线段粗细参数,那么就绘制一个像素。

除了把屏幕分割成单个像素,我们也可以按线段的斜率为每个处理器分配一条扫描线或一列像素。然后,每个处理器计算线段与分配给该处理器的水平行或垂直列的交点。对于斜率|m| < 1.0的线段,每个处理器将简单地按给定的x值从直线方程中求解y。对于斜率值大于1.0的线段,处理器则根据给定的扫描线y值,从直线方程中求解x。尽管这种直接方法在顺序算法机器中的计算速很慢,但通过使用多处理器能十分有效地完成这一算法。

时间: 2024-08-09 20:12:34

计算机图形学(二)输出图元_4_并行画线算法的相关文章

计算机图形学(二)输出图元_2_ OpenGL画线函数

 OpenGL画线函数 图形软件包一般都提供一个描述一条或多条直线段的函数,其中每一直线段由两个端点坐标位置定义.在OpenGL中,和选择一个点位置一样,我们使用glVertex函数选择单个端点的坐标位置.我们使用一对glBegin/g1End来引入一串端点位置.有三个OpenGL符号常量可用于指定如何把这一串端点位置连接成一组直线段.默认情况下,每一符号常量显示白色实线. 使用图元线常量GL_LINES可连接每一对相邻端点而得到一组直线段.通常,这会导致一组未连接的线段,除非重复某些坐标位置.

Bresenham画线算法

[Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 参考:<计算机图形学>3.5.3 Bresenham画线算法 Bresenham画线算法

图形学复习4——光栅化(画线画圆扫描线反走样算法)

图形学复习 CH7 光栅化 前几章介绍了几何处理和裁剪变换,接下来的步骤就是光栅化 光栅化是将形式表示的几何图元转换为阵列表示的数据片元的过程,片元中每一个像素对应帧缓冲区中的每一个像素 7.1 线段生成算法 (1)DDA画线算法 设直线表达式为y=mx+b,输入直线两端点坐标(x0,y0)和(xend,yend),可以计算出m=yend?y0xend?x0和b=y0?m?x0 DAA是基于微分运算的线段生成算法,其主要计算式便是δy=mδx: 若|m|≤1则x方向的变化大于y方向的变化,以x方

计算机图形学(二)输出图元_7_并行曲线算法

并行曲线算法 在曲线生成中使用的并行方法类似于显示线段中使用的方法.我们既可采用顺序算法按曲线分段分配处理器,也可以提出其他方法将处理器分配给屏幕的不同区域. 显示圆的并行中点方法是,将45°到90°的圆弧分成等长子圆弧,并给每段子圆弧配置一个处理器.然后类似于并行Bresenham画线算法,需要对每个处理器建立初始y值并确定参数pk的值.接着计算整个子圆弧的像素位置,并通过对称性得到其他八分圆中的位置.同样,并行椭圆中点算法将第一象限内的椭圆弧分割成等长弧,并将这些弧分配给各个处理器,在其他象

计算机图形学(二)输出图元_3_画线算法_1_直线方程

画线算法 场景中的直线段由其两端点的坐标位置来定义.要在光栅监视器上显示一线段,图形系统必须先将两端点投影到整数屏幕坐标,并确定离两端点间的直线路径最近的像素位置.接下来将颜色值装人帧缓存相应的像素坐标处.视频控制器从帧缓存读出写入的颜色值并绘制屏幕像素.这一过程将一线段数字化为一组离散的整数位置.一般而言,这些位置是实际线路径的近似.例如,计算出的线位置(10.48, 20.51)转换为像素位置(10, 21).坐标值舍入到整数,引起除水平和垂直以外所有线段的阶梯效应("锯齿形"),

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

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

[计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)

一.首先说明: 这是啥? —— 这是利用C#FORM写的一个用来演示计算机图形学中 ①Bresenham直线扫描算法(即:连点成线):②种子填充法(即:填充多边形):③扫描线填充法 有啥用? ——  无论是连点成线还是区域填充在高级编程中基本上都提供很高效的库函数来调用.这里拿出这些算法一方面有利于大家理解那些封装的函数底层是实现:另一方面是方便嵌入式TFT屏幕底层驱动开发时借鉴的. 是啥样? ——  如下面的操作,不言而喻. 二.进入正题: 2-1.直线的扫描转换 图形的扫描转换实质就是在光栅

图形学_画线算法(DDA、Bresenham)

1. DDA算法实现直线绘制(需先安装easyx,百度下载即可) 1 #include "easyx.h" 2 #include "math.h" 3 #include "windows.h" 4 #include "stdio.h" 5 #include "stdlib.h" 6 #include "conio.h" 7 #include "graphics.h"

图形学--(中点画线法+Bresenham画线算法)

编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我们为什么不直接用直线方程分别带点再打亮呢,这是因为,计算机中每个坐标点都是整数,而直线是由一个个像素点组合而成的,那么,直接将坐标点再进行四舍五入整数化就好了啊,的确,这是一种方法,但计算机中进行浮点数的四舍五入会使运算效率变差,因此真正画直线时是用到上边这俩种方法的. 1.中点画线法 只考虑当直线