要产生具有宽度的线,可以顺着扫描所生成的单像素线条轨迹,移动一把具有一定宽度的“刷子”来获得。
“刷子”的形状可以是一条线段或一个正方形。
一直线线宽的处理
1.线刷子
垂直线刷子:直线斜率在[–1, 1]时,把刷子置成垂直方向水平线刷子:直线斜率不在[–1, 1]时,把刷子置成水平方向
画法:将刷子的中心对准直线的一个端点,然后让刷子的中心沿着直线移动,直到直线的另一端。
线刷子的实现:只要对直线扫描转换算法的内循环稍作修改即可。
例如:当直线斜率在[–1, 1] 时,把每步迭代所得的点的上方和下方半线宽之内的像素全部置成直线颜色。假设线宽为5个像素,则把原来的putpixel(x, y, color)语句修改为下列5条语句:
putpixel (x, y-2, color);
putpixel (x, y-1, color);
putpixel (x, y, color);
putpixel (x, y+1, color);
putpixel (x, y+2, color);
线刷子的特点:
优点:算法简单、效率高。
缺点:线的始末端总是水平或垂直的。因此,当线宽较大时,看起来很不自然。
当比较接近水平的线与比较接近垂直的线汇合时,汇合处将有缺口。
对于宽度为偶数个像素的直线会产生偏移。
2.正方形刷子
画法:将边宽为指定线宽的方形刷子的中心放在直线的一个端点,方形刷子的中心沿着直线移动,直到直线的另一个端点,即可获得具有线宽的线条。
正方形刷子的实现:将正方形刷子的中心对准单像素宽的线条上的各个像素,并把正方形内的像素全部置成线条颜色。
例如:若线宽为5个像素,则可把原来的putpixel(x, y, color)语句改为下列语句组:
for(i= -2; i<=2; i++)
for(j= -2; j<=2; j++)
putpixel(x+i, y+j, color);
正方形刷子的特点:
优点:实现简单。
缺点:用方刷子绘制的线条末端也是水平或垂直的,且线宽与线条方向有关。
对于宽度为偶数个像素的直线会产生偏移。
二圆弧的线宽处理
采用线刷子:在小于45°的弧时用水平刷子,在大于45°的弧时用垂直刷子,即在经过曲线斜率为±1的点时刷子的方向要改变。所以刷出的圆弧在接近水平与垂直的地方,线条更粗一些,在斜率接近±1的点附近,线条更细一些。
线型的处理
例如,用一个32位整数可以存放32个布尔值。用这样的整数存放线型定义时,线型以32个像素为周期进行重复。实现时可以把扫描转换算法中的无条件写像素语句改为:
if (位串[i %32]) putpixel (x, y, color);