- 1、本文档共19页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五讲 线宽和线型处理 1. 直线线宽的处理 (1)线刷子 生成具有一定宽度的直线,可以沿着生成直线时获得的像素点,通过移动一把具有 一定宽度的“线刷子”来实现。 假设直线斜率在[-1,1]之间,可把线刷子定成垂直方向,并将线刷子中心点对准直线上某一像素点,然后将线刷子沿直线运动就刷出了一条具有一定宽度的直线。 当直线斜率不在[-1,1]之间时,只需把线刷子运动方向改为水平方向即可。 LineBrush (int x,int y,int color) {Drawpixel(x,y,color); Drawpixel(x+1,y,color); Drawpixel(x-1,y,color); Drawpixel(x+2,y,color); Drawpixel(x-2,y,color); Drawpixel(x-3,y,color); Drawpixel(x+3,y,color); } 线刷子的特点: 实现简单、效率高。 斜线与水平(或垂直)线粗细不均匀。 当线宽为偶数个象素时,线的中心将偏移半个象素。 利用线刷子生成线的始末端总是水平或垂直的,看起来不太自然,在两条直线的连接处会产生缺口; 解决:添加“线帽(line cap)” 当比较接近水平的线与比较接近垂直的线汇合时,汇合处外角将有缺口。 解决: 斜角连接(miter join) 圆连接(round join) 斜切连接(bevel join) (2)正方形刷子 把边宽为指定线宽的正方形的中心沿直线平行移动,即可获得具有线宽的线条。 实现正方形刷子最简单的办法是:把正方形中心对准单象素宽的线条上各个元素,并把正方形内的象素全部置成线条颜色。这种简单方法将重复地写象素。这是因为相邻两象素的方形一般会重叠。 方刷子的特点: 简单,容易实现。 效率低。 线的末端总是水平或垂直的; 在两条直线的连接处会产生缺口; 宽度不均匀; 宽度为偶数时无法实现。 方刷子绘制的线条自然地带有一个“方线帽” SquarBrush (int x,int y,int color) {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); } 为了避免重复写象素,可以采用与活性边表类似的技术,为每条扫描线建一个表,存放该扫描线与线条的相交区间左右端点位置,在每个象素使用正方形刷子时,用该方形与扫描线的相交区间端点坐标去更新原表内端点数据。 3. 其它线宽处理方式 区域填充 改变刷子形状: 2. 圆弧线宽的处理 为生成具有一定宽度的圆弧,可考虑与生成具有一定宽度的直线类似的方法,即用“刷子”来刷出具有宽度的圆弧。 而当采用正方形刷子时无需改变刷子的方向,只需沿着圆弧像素,把刷子中心对准圆弧移动刷子即可,这样刷出来的直线在接近水平或垂直方向时最细,而且斜率为正负1时最粗。 此外,还可以采用填充的方式,即先绘制出圆弧的内、外边界,然后在内外边界之间进行填色。 3.线型的处理 有时需绘制特殊线型的线条,如虚线、点划线等,以便区分各种不同的意义。如采用实线表示立体线框中可见的轮廓线,用虚线表示不可见的轮廓线,用点划线表示中心线等。 线型可用一个布尔值的数组来存放。例如,用一个18位整数可以存放18个布尔值,用这样的整数存放线型定义时,线型必须以18个象素为周期进行重复。 将写像素语句 DrawPixel(x,y,color) 更改为: if (位串[i%18]) DrawPixel(x,y,color) 其中i为循环变量,每处理一个象素递增1。 缺点: 采用固定划线长度的实现方法会在不同直线方向上产生出不等长的划线段。原因在于相同个数的象素沿不同方向将生成不同长度的线段。 解决方法: 为实现精确的线型定义,应按照直线的斜率调整线型定义数组中实线段和空白段的象素数目。 或对象素形成的线段
文档评论(0)