1 / 110

第三章 输出图元

第三章 输出图元. 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:0551-3603484 Email:l fdong@ustc.edu.cn Homepage: http://staff.ustc.edu.cn/~lfdong/research.html 中国科学技术大学 视觉计算与可视化实验室. 第三章 输出图元. 图元的生成: 从图元的参数表示形式(由图形软件包 的使用者指定)到点阵表示形式(光栅显示系统刷新时所

makani
Télécharger la présentation

第三章 输出图元

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 输出图元 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 Telephone:0551-3603484 Email:lfdong@ustc.edu.cn Homepage: http://staff.ustc.edu.cn/~lfdong/research.html 中国科学技术大学 视觉计算与可视化实验室

  2. 第三章 输出图元 图元的生成:从图元的参数表示形式(由图形软件包 的使用者指定)到点阵表示形式(光栅显示系统刷新时所 需的表示形式)的转换。

  3. 第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区

  4. 3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论

  5. 3.1.1 DDA画线算法 • 直线段生成 • 求与直线段充分接近的 像素集 • 像素间网格均匀 • 坐标是整型 • 假设 • 直线段的宽度为1 线段的生成

  6. 3.1.1 DDA画线算法 • 数字微分(DDA)画线算法 (Digital Differential Analyzer)

  7. 3.1.1 DDA画线算法 • 数字微分(DDA)画线算法 (digital differential analyzer) • 直接求交算法: • 划分区间[0, 1],dt=1/n • 计算坐标 • 取整 • 复杂度:乘法+加法+取整

  8. 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 复杂度:加法+取整

  9. 3.1.1 DDA画线算法 • xi+1=xi+xinc • yi+1=yi+yinc • DDA算法优点 • 利用光栅特性消除了直线方程中的乘法,比直接使用直线方程的计算速度快! • DDA算法缺点: • 取整误差的积累使得对于较长线段所计算的像素位置偏离实际线段。 • 需要进行浮点数运算。 • 运行效率低。 • 不便于用硬件实现 。

  10. 3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论

  11. 3.1.2 Bresenham画线算法 • 目标:消除DDA算法中的浮点运算 • 线段的端点坐标:(x1,y1)和(x2,y2) • 线段方程:y=mx+b

  12. 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)。

  13. 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的符号。

  14. 3.1.2 Bresenham画线算法 • 在x=x1 +1处,dlower=m, dupper=1-m, p1= 2Δy – Δx • Bresenham画线算法的特点 • 只包括整数的加法、减法和左移(乘2)操作,效率高。 • 适合用硬件实现。 • 思考:Bresenham画线算法如何应用到其它卦限?

  15. 3.1.2 Bresenham画线算法 • 2月21日作业1 实现一个折线函数,用Bresenham画线算法来显示连接n个输入点的一组线段。当n=1时绘制单个点。

  16. 3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论

  17. 线段的包围盒 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

  18. 线段的包围盒 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小于某个设定值,该像素就被 设置成指定的线段颜色。可以看出, 这种并行画线算法特别适合于画具有 一定宽度的线段。

  19. 3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论

  20. 3.1.4 画线算法的讨论 • 线段端点的次序要求 :线段P1P2与线段P2P1在图元生成后应该生成相同的像素集合,这样才能保证同一线段的像素表示与线段的端点次序无关。 • 存在问题:前述算法中,线段P1P2与线段P2P1上的点可能不一致。 • 解决方法:对于|k|≤1的线段,总是以左端点为 起点,从左向右生成;对于|k|>1的线段,总是以下 端点为起点,从下向上生成。

  21. 3.1.4 画线算法的讨论 • 线段的亮度 现象:A比B亮。 原因:A上的像素点密集。 解决方法:图形保真技术。

  22. 3.1 画线算法 • 3.1.1 DDA画线算法 • 3.1.2 Bresenham画线算法 • 3.1.3 并行画线算法 • 3.1.4 画线算法的讨论

  23. 第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区

  24. 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

  25. 第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区

  26. 3.3 圆、椭圆的生成 • 3.3.1 圆的生成 • 3.3.2 椭圆的生成

  27. 3.3.1 圆的生成 • 处理对象:圆心在原点的圆弧 • 圆的八对称性 • 两种直接离散方法: 离散点: x2+y2=R (x,sqrt(R2-x2)) 离散角度:x=Rcosθ y=Rsinθ 缺点:计算量大。

  28. 3.3.1 圆的生成 • 圆弧的正负划分性 F(x,y)=x2+y2-R2 • 圆弧外的点:F(X,Y)>0 • 圆弧内的点:F(X,Y)<0

  29. 3.3.1 圆的生成 • 中点画圆算法的优点: • 效率高。 • 只用到整数的加法、 减法和左移。 • (乘2)运算。 • 适合用硬件实现。 中点画圆算法示意图

  30. 3.3.1 圆的生成

  31. 3.3.1 圆的生成

  32. 3.3.1 圆的生成 • 2月21日作业2 教材P139 3.21

  33. 3.3 圆、椭圆的生成 • 3.3.1 圆的生成 • 3.3.2 椭圆的生成

  34. 3.3.2 椭圆的生成 • 椭圆 • 通过椭圆上任 一点到两个焦点 的距离之和等于 常数。 • 椭圆方程f(x,y)=ry2x2+rx2y2-rx2ry2=0。 • 椭圆的对称性。

  35. 第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区

  36. 3.4 其他曲线 • 3.4.1 画锥曲线 • 3.4.2 多项式曲线 Ax2+By2+Cxy+Dx+Ey+F=0 y=a0+a1x+a2x2+……an-1xn-1+anxn

  37. 第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区

  38. 3.5 并行曲线画法 • 圆:等份圆弧或x坐标 • 椭圆或其它曲线:扫描线分段方法

  39. 第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行曲线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 多边形的填充 • 3.9 区域填充图元

  40. 3.6 像素编址和对象的几何要素 • 当对象经扫描转换进帧缓存后,输入描述变换为 对应有限屏幕区域的像素坐标,且显示的光栅图像 可能并不严格符合相关的尺寸。 • 解决方法: • 简单地按照物体边界与像素区域的覆盖量来 调整物体的显示尺寸。 • 将世界坐标系映射到像素间的屏幕位置,使物 体的边界与像素边界对齐,而不是与像素中心对 齐。 • 屏幕上( x,y)占据对角位置(x,y)和(x+1,y+1)处 • 的单位正方形。

  41. 第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区

  42. 3.7 保留显示的物体的几何特性 • 将物体的几何描述转换为象素表示时,将把数学上的点转换为有限的屏幕区域.假如要保留由物体的输入坐标指定的原始几何度量,那么在将物体的定义转换到屏幕显示时,就需要考虑象素的有限尺寸。

  43. 第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区

  44. 3.8 填充区图元 • 填充区 • 表面细分

  45. 第三章 输出图元 • 3.1 画线算法 • 3.2 帧缓冲器的装载 • 3.3 圆、椭圆和圆弧的生成 • 3.4 其它曲线 • 3.5 并行画线算法 • 3.6 像素编址和对象的几何要素 • 3.7 保留显示物体的几何特性 • 3.8 填充区图元 • 3.9 多边形填充区 • 3.10 OpenGL学习

  46. 3.9 多边形填充区 • 多 边 形:由三个或更多称为顶点的坐标位置描述的 平面图形。 • 分 类:凸多边形或凹多边形。 • 退化多边形:共线或重叠坐标位置的顶点集。

  47. 3.9 多边形填充区 • 多边形的表示方法 • 顶点表示 • 点阵表示

  48. 3.9 多边形填充区 • 逐个判断绘图窗口内的像素: • 如何判断点与多边形的内外关系? 逐点判断法程序简单, 速度太慢,效率低!

  49. 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() */

  50. 3.9 多边形填充区 射线法 • 由点Pc(xc,yc)出发向任意方向作射线,计算此射线与 • 多边形所有交点个数,如果交点个数为奇数,则点在多边 • 形内部,如果交点个数为偶数,则点在多边形外部.

More Related