资源描述:
《计算机图形学 线宽和线型处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第五讲线宽和线型处理1.直线线宽的处理(1)线刷子生成具有一定宽度的直线,可以沿着生成直线时获得的像素点,通过移动一把具有一定宽度的“线刷子”来实现。假设直线斜率在[-1,1]之间,可把线刷子定成垂直方向,并将线刷子中心点对准直线上某一像素点,然后将线刷子沿直线运动就刷出了一条具有一定宽度的直线。当直线斜率不在[-1,1]之间时,只需把线刷子运动方向改为水平方向即可。线刷子(a)(b)LineBrush(intx,inty,intcolor){Drawpixel(x,y,color);Drawpixel(x+1,y,color);Drawpixel(x-1,y,c
2、olor);Drawpixel(x+2,y,color);Drawpixel(x-2,y,color);Drawpixel(x-3,y,color);Drawpixel(x+3,y,color);}水平线刷子的实现线刷子的特点:实现简单、效率高。斜线与水平(或垂直)线粗细不均匀。当线宽为偶数个象素时,线的中心将偏移半个象素。利用线刷子生成线的始末端总是水平或垂直的,看起来不太自然,在两条直线的连接处会产生缺口;解决:添加“线帽(linecap)”当比较接近水平的线与比较接近垂直的线汇合时,汇合处外角将有缺口。线刷子产生的缺口线刷子产生的缺口(a)斜角连接(b)圆连
3、接(c)斜切连接解决:斜角连接(miterjoin)圆连接(roundjoin)斜切连接(beveljoin)(2)正方形刷子把边宽为指定线宽的正方形的中心沿直线平行移动,即可获得具有线宽的线条。实现正方形刷子最简单的办法是:把正方形中心对准单象素宽的线条上各个元素,并把正方形内的象素全部置成线条颜色。这种简单方法将重复地写象素。这是因为相邻两象素的方形一般会重叠。方刷子方刷子的特点:简单,容易实现。效率低。线的末端总是水平或垂直的;在两条直线的连接处会产生缺口;宽度不均匀;宽度为偶数时无法实现。方刷子绘制的线条自然地带有一个“方线帽”SquarBrush(int
4、x,inty,intcolor){Drawpixel(x,y,color);Drawpixel(x+1,y,color);Drawpixel(x-1,y,color);Drawpixel(x+1,y+1,color);Drawpixel(x-1,y+1,color);Drawpixel(x+1,y-1,color);Drawpixel(x-1,y-1,color);Drawpixel(x,y-1,color);Drawpixel(x,y+1,color);}方刷子的实现为了避免重复写象素,可以采用与活性边表类似的技术,为每条扫描线建一个表,存放该扫描线与线条的相交
5、区间左右端点位置,在每个象素使用正方形刷子时,用该方形与扫描线的相交区间端点坐标去更新原表内端点数据。3.其它线宽处理方式区域填充改变刷子形状:2.圆弧线宽的处理为生成具有一定宽度的圆弧,可考虑与生成具有一定宽度的直线类似的方法,即用“刷子”来刷出具有宽度的圆弧。采用线刷子生成具有一定宽度的圆弧时,在小于45度的弧时用水平刷子,在大于45度的弧时用垂直刷子,即在经过曲线斜率为正负1的点时刷子的方向要改变。因此刷出的圆弧在接近水平或垂直方向的部分线条会粗一些,而在斜率接近正负1点附近则细一些。而当采用正方形刷子时无需改变刷子的方向,只需沿着圆弧像素,把刷子中心对准圆
6、弧移动刷子即可,这样刷出来的直线在接近水平或垂直方向时最细,而且斜率为正负1时最粗。此外,还可以采用填充的方式,即先绘制出圆弧的内、外边界,然后在内外边界之间进行填色。3.线型的处理有时需绘制特殊线型的线条,如虚线、点划线等,以便区分各种不同的意义。如采用实线表示立体线框中可见的轮廓线,用虚线表示不可见的轮廓线,用点划线表示中心线等。线型可用一个布尔值的数组来存放。例如,用一个18位整数可以存放18个布尔值,用这样的整数存放线型定义时,线型必须以18个象素为周期进行重复。111100111100111100将写像素语句DrawPixel(x,y,color)更改为
7、:if(位串[i%18])DrawPixel(x,y,color)其中i为循环变量,每处理一个象素递增1。缺点:采用固定划线长度的实现方法会在不同直线方向上产生出不等长的划线段。原因在于相同个数的象素沿不同方向将生成不同长度的线段。解决方法:为实现精确的线型定义,应按照直线的斜率调整线型定义数组中实线段和空白段的象素数目。或对象素形成的线段的长度进行记录,按长度进行处理,不按象素的个数进行处理。另一种精确定义线型的方法是:将线上的每一段实划线作为一段单独的线段,定位其始末端点坐标,再调用直线的扫描转换算法实现绘制。