1.1k likes | 1.33k Views
第三章 输出图元. 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:0551-3603484 Email:l fdong@ustc.edu.cn Homepage: http://staff.ustc.edu.cn/~lfdong/research.html 中国科学技术大学 视觉计算与可视化实验室. 第三章 输出图元. 图元的生成: 从图元的参数表示形式(由图形软件包 的使用者指定)到点阵表示形式(光栅显示系统刷新时所
E N D
第三章 输出图元 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:0551-3603484 Email:lfdong@ustc.edu.cn Homepage: http://staff.ustc.edu.cn/~lfdong/research.html 中国科学技术大学 视觉计算与可视化实验室
第三章 输出图元 图元的生成:从图元的参数表示形式(由图形软件包 的使用者指定)到点阵表示形式(光栅显示系统刷新时所 需的表示形式)的转换。
第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区
3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论
3.1.1 DDA画线算法 • 直线段生成 • 求与直线段充分接近的 像素集 • 像素间网格均匀 • 坐标是整型 • 假设 • 直线段的宽度为1 线段的生成
3.1.1 DDA画线算法 • 数字微分(DDA)画线算法 (Digital Differential Analyzer)
3.1.1 DDA画线算法 • 数字微分(DDA)画线算法 (digital differential analyzer) • 直接求交算法: • 划分区间[0, 1],dt=1/n • 计算坐标 • 取整 • 复杂度:乘法+加法+取整
3.1.1 DDA画线算法 • DDA增量算法 xi+1=x1+∆x*ti+1=xi+∆x*dt=xi+xinc yi+1=y1+∆y*ti+1=yi+∆y*dt=yi+yinc 复杂度:加法+取整
3.1.1 DDA画线算法 • xi+1=xi+xinc • yi+1=yi+yinc • DDA算法优点 • 利用光栅特性消除了直线方程中的乘法,比直接使用直线方程的计算速度快! • DDA算法缺点: • 取整误差的积累使得对于较长线段所计算的像素位置偏离实际线段。 • 需要进行浮点数运算。 • 运行效率低。 • 不便于用硬件实现 。
3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论
3.1.2 Bresenham画线算法 • 目标:消除DDA算法中的浮点运算 • 线段的端点坐标:(x1,y1)和(x2,y2) • 线段方程:y=mx+b
3.1.2 Bresenham画线算法 • Bresenham画线算法思想 • (xk,yk)是直线段上的点 • H:(xk+1,yk+1) • L:(xk+1,yk) • A: (xk+1,y)=(xk+1,m(xk+1)+b) • dlower>dupper,取H点 • dlower<dupper,取L点 • dlower=dupper,选择H或L均可 • 令p= dlower-dupper, p> 0取上像素 (xk+1, yk+1) , • p< 0 采用下像素(xk+1, yk)。
3.1.2 Bresenham画线算法 • y=m(xk+1)+b • dlower=y-yk=m(xk+1)+b-yk dupper=yk+1-y=yk+1-m(xk+1)-b • dlower-dupper=2m(xk+1)-2yk+2b-1 • m= 2Δy /Δx pk=Δx(dlower-dupper)=2Δy .xk-2Δx.yk+c pk+1= 2Δy .xk+1- 2Δx.yk+1+c • pk+1-pk=2Δy(xk+1-xk)-2Δx(yk+1-yk) pk+1=pk+2Δy(xk+1-xk)-2Δx(yk+1-yk) xk+1-xk=1 pk+1=pk+2Δy-2Δx(yk+1-yk) • pk+1> 0取上像素,pk+1< 0 取下像素。 • yk+1-yk=0或1,取绝于参数pk的符号。
3.1.2 Bresenham画线算法 • 在x=x1 +1处,dlower=m, dupper=1-m, p1= 2Δy – Δx • Bresenham画线算法的特点 • 只包括整数的加法、减法和左移(乘2)操作,效率高。 • 适合用硬件实现。 • 思考:Bresenham画线算法如何应用到其它卦限?
3.1.2 Bresenham画线算法 • 2月21日作业1 实现一个折线函数,用Bresenham画线算法来显示连接n个输入点的一组线段。当n=1时绘制单个点。
3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论
线段的包围盒 3.1.3 并行画线算法 • 让每一个处理器处理一组像素 适用于系统中的处理器非常多 的场合。 • 给定一条线段,可以得到它的 包围盒,包围盒中共有∆x*∆y 个像素。让每个处理器处理一 个像素,设像素的坐标为(x,y), 则像素到线段的垂直距离: d=A*x+B*y+C 其中,A=-∆y/linelength B=∆x/linelength C=(x1∆x-y1∆x)/linelength
线段的包围盒 3.1.3 并行画线算法 • 像素到线段的垂直距离: d=A*x+B*y+C 其中,A=-∆y/linelength B=∆x/linelength C=(x1∆x-y1∆x)/linelength Linelength=(∆x2+∆y2)1/2 d小于某个设定值,该像素就被 设置成指定的线段颜色。可以看出, 这种并行画线算法特别适合于画具有 一定宽度的线段。
3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论
3.1.4 画线算法的讨论 • 线段端点的次序要求 :线段P1P2与线段P2P1在图元生成后应该生成相同的像素集合,这样才能保证同一线段的像素表示与线段的端点次序无关。 • 存在问题:前述算法中,线段P1P2与线段P2P1上的点可能不一致。 • 解决方法:对于|k|≤1的线段,总是以左端点为 起点,从左向右生成;对于|k|>1的线段,总是以下 端点为起点,从下向上生成。
3.1.4 画线算法的讨论 • 线段的亮度 现象:A比B亮。 原因:A上的像素点密集。 解决方法:图形保真技术。
3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论
第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区
3.2 帧缓冲器的装载 addr(x,y)=addr(0,0)+y*xmax+x addr(x+1,y)=addr(x,y)+1 addr(x+1,y+1)=addr(x,y)+xmax+1
第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区
3.3 圆、椭圆的生成 • 3.3.1 圆的生成 • 3.3.2 椭圆的生成
3.3.1 圆的生成 • 处理对象:圆心在原点的圆弧 • 圆的八对称性 • 两种直接离散方法: 离散点: x2+y2=R (x,sqrt(R2-x2)) 离散角度:x=Rcosθ y=Rsinθ 缺点:计算量大。
3.3.1 圆的生成 • 圆弧的正负划分性 F(x,y)=x2+y2-R2 • 圆弧外的点:F(X,Y)>0 • 圆弧内的点:F(X,Y)<0
3.3.1 圆的生成 • 中点画圆算法的优点: • 效率高。 • 只用到整数的加法、 减法和左移。 • (乘2)运算。 • 适合用硬件实现。 中点画圆算法示意图
3.3.1 圆的生成 • 2月21日作业2 教材P139 3.21
3.3 圆、椭圆的生成 • 3.3.1 圆的生成 • 3.3.2 椭圆的生成
3.3.2 椭圆的生成 • 椭圆 • 通过椭圆上任 一点到两个焦点 的距离之和等于 常数。 • 椭圆方程f(x,y)=ry2x2+rx2y2-rx2ry2=0。 • 椭圆的对称性。
第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区
3.4 其他曲线 • 3.4.1 画锥曲线 • 3.4.2 多项式曲线 Ax2+By2+Cxy+Dx+Ey+F=0 y=a0+a1x+a2x2+……an-1xn-1+anxn
第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区
3.5 并行曲线画法 • 圆:等份圆弧或x坐标 • 椭圆或其它曲线:扫描线分段方法
第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行曲线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 多边形的填充 • 3.9 区域填充图元
3.6 像素编址和对象的几何要素 • 当对象经扫描转换进帧缓存后,输入描述变换为 对应有限屏幕区域的像素坐标,且显示的光栅图像 可能并不严格符合相关的尺寸。 • 解决方法: • 简单地按照物体边界与像素区域的覆盖量来 调整物体的显示尺寸。 • 将世界坐标系映射到像素间的屏幕位置,使物 体的边界与像素边界对齐,而不是与像素中心对 齐。 • 屏幕上( x,y)占据对角位置(x,y)和(x+1,y+1)处 • 的单位正方形。
第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区
3.7 保留显示的物体的几何特性 • 将物体的几何描述转换为象素表示时,将把数学上的点转换为有限的屏幕区域.假如要保留由物体的输入坐标指定的原始几何度量,那么在将物体的定义转换到屏幕显示时,就需要考虑象素的有限尺寸。
第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区
3.8 填充区图元 • 填充区 • 表面细分
第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区 • 3.10 OpenGL学习
3.9 多边形填充区 • 多 边 形:由三个或更多称为顶点的坐标位置描述的 平面图形。 • 分 类:凸多边形或凹多边形。 • 退化多边形:共线或重叠坐标位置的顶点集。
3.9 多边形填充区 • 多边形的表示方法 • 顶点表示 • 点阵表示
3.9 多边形填充区 • 逐个判断绘图窗口内的像素: • 如何判断点与多边形的内外关系? 逐点判断法程序简单, 速度太慢,效率低!
3.9 多边形填充区 #define MAX 100 Typedef struct { int PolygonNum; // 多边形顶点个数 Point vertexces[MAX] //多边形顶点数组 } Polygon // 多边形结构 void FillPolygonPbyP(Polygon *P,int polygonColor) { int x,y; 计算 ymin,ymax,xmin,xmax; for(y = ymin;y <= ymax;y++) for(x = xmin;x <= xmax;x++) if(IsInside(P,x,y)) PutPixel(x,y,polygonColor); else PutPixel(x,y,backgroundColor); }/*end of FillPolygonPbyP() */
3.9 多边形填充区 射线法 • 由点Pc(xc,yc)出发向任意方向作射线,计算此射线与 • 多边形所有交点个数,如果交点个数为奇数,则点在多边 • 形内部,如果交点个数为偶数,则点在多边形外部.