(14)线宽与线型的处理

在实际应用中,除了使用单像素宽的线条,还经常使用指定线宽和线型的直线与弧线。
要产生具有宽度的线,可以顺着扫描所生成的单像素线条轨迹,移动一把具有一定宽度的“刷子”来获得。

“刷子”的形状可以是一条线段或一个正方形。


一直线线宽的处理

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的点附近,线条更细一些。


用正方形刷子:不需要改变刷子方向。只需沿着单像素宽的轨迹,把正方形中心对准轨迹上的像素,把方形内的像素全部置成线条颜色。用正方形刷子绘制的曲线,在接近水平与垂直的部分最细,在斜率为±1的点附近最粗。 


线型的处理 

在绘图应用中常用到不同线型的线条,以便区分各种不同的意义。如,采用实线表示立体线框图中可见的轮廓线,用虚线表示不可见的轮廓线,用点划线表示中心线等。

线型可以用一个布尔值序列来存放。
例如,用一个32位整数可以存放32个布尔值。用这样的整数存放线型定义时,线型以32个像素为周期进行重复。实现时可以把扫描转换算法中的无条件写像素语句改为:
      if (位串[i %32])   putpixel (x, y, color);
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值