380 likes | 516 Views
第二章 光栅图形学. 2.1 直线段的扫描转换算法 2.2圆弧的扫描转换算法 2.3多边形的扫描转换与区域填充 2.4字符 2.5裁剪 2.6反走样 2.7 消隐. 2.5 裁剪. 裁剪: 确定图形中哪些部分落在显示区之内,哪些落在显示区之外 , 以便只显示落在显示区内的那部分图形。这个选择过程称为 裁剪 。 在使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图的一部分。. 问:为什么要裁减,直接处理呢?即:在绘制(写帧缓存时)再处理?.
E N D
第二章 光栅图形学 2.1直线段的扫描转换算法 2.2圆弧的扫描转换算法 2.3多边形的扫描转换与区域填充 2.4字符 2.5裁剪 2.6反走样 2.7消隐 清华大学 计算机图形学
2.5 裁剪 • 裁剪:确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形。这个选择过程称为裁剪。 在使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图的一部分。 清华大学 计算机图形学
问:为什么要裁减,直接处理呢?即:在绘制(写帧缓存时)再处理?问:为什么要裁减,直接处理呢?即:在绘制(写帧缓存时)再处理? 清华大学 计算机图形学
最简单的裁剪方法是把各种图形扫描转换为点之后,再判断各点是否在窗内。但那样太费时,一般不可取。这是因为有些图形组成部分全部在窗口外,可以完全排除,不必进行扫描转换。所以一般采用先裁剪再扫描转换的方法。最简单的裁剪方法是把各种图形扫描转换为点之后,再判断各点是否在窗内。但那样太费时,一般不可取。这是因为有些图形组成部分全部在窗口外,可以完全排除,不必进行扫描转换。所以一般采用先裁剪再扫描转换的方法。 清华大学 计算机图形学
2.5.1直线段裁剪 • 直线段裁剪算法是复杂图元裁剪的基础。复杂的曲线可以通过折线段来近似,从而裁剪问题也可以化为直线段的裁剪问题。 2.5.1.1Cohen-Sutherland 2.5.1.2中点分割算法 2.5.1.3梁友栋-barskey算法。 清华大学 计算机图形学
P1 P1 1 2 P1 P2 P2 3 P2 2.5.1.1 Cohen-Sutherland裁剪 • 基本思想:对于每条线段P1P2分为三种情况处理分为三种情况处理: (1)若P1P2完全在窗口内,则显示该线段P1P2简称“取”之。 (2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。 (3)若线段不满足“取”或 “弃”的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。 清华大学 计算机图形学
线段裁剪 编码 • 为快速判断,采用如下编码方法: • 每个区域赋予4位编码 清华大学 计算机图形学
P1 P1 1 2 P1 P2 P2 3 P2 线段裁剪 编码 • 若P1P2完全在窗口内code1=0,且code2=0,则“取” • 若P1P2明显在窗口外code1&code2≠0,则“弃” • 在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。 清华大学 计算机图形学
计算线段P1(x1,y1)P2(x2,y2)与窗口边界的交点 if(LEFT&code !=0) { x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1);} else if(RIGHT&code !=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1);} else if(BOTTOM&code !=0) { y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1);} else if(TOP & code !=0) { y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1);} 示例 清华大学 计算机图形学
2.5.1.2 中点分割裁剪算法 • 基本思想: 与前一种Cohen-Sutherland算法一样首先对线段端点进行编码,并把线段与窗口的关系分为三种情况: • 全在、完全不在和线段和窗口有交。对前两种情况,进行一样的处理。 • 对于第三种情况,用中点分割的方法求出线段与窗口的交点。 清华大学 计算机图形学
求线段与窗口的交点 A、B分别为距P0、P1最近的可见点,Pm为P0P1中点 清华大学 计算机图形学
从 出发找最近可见点的方法 • 先求出 的中点 • 若 不是显然不可见的,并且 在窗口中有可见部分,则距 最近的可见点一定落在 上,所以用 代替 ; 清华大学 计算机图形学
否则取 代替 • 再对新的 求中点 。重复上述过程,直到 长度小于给定的控制常数为止,此时 收敛于交点。 • 从 出发找最近可见点采用上面类似方法。 清华大学 计算机图形学
B P4 P3 ymax U S A P1 P2 ymin T R L xmax xmin AS是一维窗口TS中的可见部分 2.5.1.3梁友栋-Barsky算法 • 基本思想: • 把二维裁剪化为一维裁剪问题,并向x(或y)方向投影以决定可见线段。 • 直线L与区域的交: • 当Q为空集时,线段AB不可能在窗口中有可见线段。 • 当Q不为空集时,Q可看成是一个一维窗口 清华大学 计算机图形学
左端点 右端点 B P4 P3 ymax U S A P1 P2 ymin T R L xmax xmin AS是一维窗口TS中的可见部分 2.5.1.3梁友栋-Barsky算法 • 存在可见线段的充要条件 • 不为空集 • 向x轴投影,就得到可见线段上点的坐标的变化范围为 清华大学 计算机图形学
2.5.1.3梁友栋-Barsky算法 • AB有可见部分的充分必要条件也可表示为 清华大学 计算机图形学
2.5.2 多边形裁剪 • 基本思想是一次用窗口的一条边裁剪多边形。 • 考虑窗口的一条边以及延长线构成的裁剪线 该线把平面分成两个部分:可见一侧;不可见一侧 清华大学 计算机图形学
多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种 清华大学 计算机图形学
每条线段端点与S,P与裁剪线比较之后,可输出0~2顶点每条线段端点与S,P与裁剪线比较之后,可输出0~2顶点 • 对于 • 情况(1)仅输出顶点P; • 情况(2)输出0个顶点; • 情况(3)输出线段SP与裁剪线的交点I; • 情况(4)输出线段SP与裁剪线的交点I和终点P 清华大学 计算机图形学
上述算法仅用一条裁剪边对多边形进行裁剪,得到一个顶点序列,作为下一条裁剪边处理过程的输入。上述算法仅用一条裁剪边对多边形进行裁剪,得到一个顶点序列,作为下一条裁剪边处理过程的输入。 • 对于每一条裁剪边,只是判断点在窗口哪一侧以及求线段SP与裁剪边的交点算法应随之改变。 清华大学 计算机图形学
示意图(5之1) 清华大学 计算机图形学
示意图(5之2) 清华大学 计算机图形学
示意图(5之3) 清华大学 计算机图形学
示意图(5之4) 清华大学 计算机图形学
示意图(5之5) 清华大学 计算机图形学
其他窗口的裁剪 • 圆域窗口裁剪:潜望镜、... • 任意(凸)多边形裁剪:个性化电脑显示器定制, 清华大学 计算机图形学
2.5.3 字符裁剪 • 字符裁剪可按三个精度来进行裁剪 • 串精度:将包围字串的外接矩形对窗口作裁剪 • 字符精度:将包围字的外接矩形对窗口作裁剪 • 以及笔画\像素精度:将笔划分解成直线段对窗口作裁剪 待裁剪字符串 串精度裁剪 字符精度裁剪 像素精度裁剪 清华大学 计算机图形学
2.6 走样与反走样2.6.1 走样 • 用离散量表示连续量引起的失真现象称之为走样(aliasing) • 走样类别 • 阶梯形走样 • 亮度走样 • 细节走样 • 狭小图形走样 清华大学 计算机图形学
用于减少或消除这种效果的技术称为反走样(antialiasing)用于减少或消除这种效果的技术称为反走样(antialiasing) 2.6.2 提高分辨率 2.6.3 区域采样 2.6.4 加权区域取样 清华大学 计算机图形学
2.6.2 提高分辨率 • 把显示器分辨率提高一倍, • 直线经过两倍的像素,锯齿也增加一倍, • 但同时每个阶梯的宽度也减小了一倍, • 所以显示出的直线段看起来就平直光滑了一些。 • 增加分辨率虽然简单,但是不经济的方法,有物理上的困难 • 而且它也只能减轻而不能消除锯齿问题 清华大学 计算机图形学
2.6.3 区域采样 • 基本思想: • 每个像素是一个具有一定面积的小区域,将直线段看作具有一定宽度的狭长矩形。当直线段与像素有交时,求出两者相交区域的面积,然后根据相交区域面积的大小确定该像素的亮度值。 清华大学 计算机图形学
有宽度的线条轮廓 像素相交的五种情况及用于计算面积的量 清华大学 计算机图形学
面积计算 • 情况⑴(5)阴影面积为:D2/2m; • 情况⑵(4)阴影面积为:D - m/2; • 情况⑶阴影面积为:1 - D2/m • 结果是0~1之间的正数,用它乘以像素的最大灰度值,再取整即可得到像素的显示灰度值 清华大学 计算机图形学
为了简化计算可以采用离散的方法 n=9,k=3近似面积为1/3 • 首先将屏幕像素均分成n个子像素, • 然后计算中心点落在直线段内的子像素的个数k。 • 将屏幕该像素的亮度置为相交区域面积的近似值可k/n。 清华大学 计算机图形学
非加权区域采样方法有两个缺点: • 像素的亮度与相交区域的面积成正比,而与相交区域落在像素内的位置无关,这仍然会导致锯齿效应。 • 直线条上沿理想直线方向的相邻两个像素有时会有较大的灰度差。 清华大学 计算机图形学
2.6.4 加权区域取样 • 基本思想: • 使相交区域对像素亮度的贡献依赖于该区域与像素中心的距离 • 当直线经过该像素时,该像素的亮度F是在两者相交区域A’上对滤波器(函数w)进行积分的积分值。 清华大学 计算机图形学
可采用离散计算方法 • 如:我们将屏幕划分为n=3×3个子像素,加权表可以取作: • 权函数w(x,y)为微面元dA与像素中心距离d的函数 清华大学 计算机图形学
然后求出所有中心落于直线段内的子像素。 • 最后计算所有这些子像素对原像素亮度贡献之和 乘以像素的最大灰度值作为该像素的显示灰度值。 清华大学 计算机图形学