码迷,mamicode.com
首页 > 编程语言 > 详细

计算机图形学——光栅图形学直线算法简介

时间:2015-04-12 15:58:09      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

本文是对 赵明老师 《计算机图形学》MOOC课程 部分章节的小总结。

 

直线是组成图形的基础,其算法往往被多次调用,其好坏直接影响图形的显示效果和速度。以下是一些画直线的常用算法。

 

1、DDA算法:

  此算法基于增量思想。

  对于直线的斜截式:y=kx+b,考虑每次 x 递增 1, 都有 y[i+1] = y[i] + k,这样就将 kx 部分的乘法转换成递推的加法。

  由于像素点都是整数坐标,所以每次求得的 y 都要取整操作,采用加 0.5 取整数部分的方法:(int)(y[i]+0.5)。

  但是,当 |k| > 1 时,由于 x 每次递增 1,会导致取的光栅采样点过稀,可能不足以近似趋近 理想的数学意义上的直线。

  该算法的效率是:浮点数加法级别的。

 

2、中点画线法:

  此算法依然基于增量思想。

  对于直线的一般式:Ax+By+C=0,当|k|<1时,考虑每次 x 递增 1,y[i+1] 都只可能等于 y[i] 或者 y[i]+1,它取决于对于中点误差项的判断。

  技术分享

  技术分享

  如何判断Q在M的上方还是下方?把 M 点代入直线一般式:技术分享

  所以中点画线法的基本原理是:

  技术分享

  接下来的关键在于推导出 d 的递推式以将乘法运算转换为加法运算。

  当 d0<0,也就是取 Pu 时,对于下一个点:

  技术分享

  当 d0>0,也就是取 Pd 时,对于下一个点:

  技术分享

  技术分享

  技术分享

  (d只需要判断其符号,故可以用2d放大消除浮点运算)。

 

3、Bresenham 算法:

  技术分享

  技术分享

  技术分享

  技术分享

  技术分享

  并且算法不依赖于直线方程的类型。

  技术分享

  技术分享

  技术分享这样就将效率提高到了整数加法级别。

  技术分享

  技术分享

  且不依赖于直线方程的形式。

计算机图形学——光栅图形学直线算法简介

标签:

原文地址:http://www.cnblogs.com/maples7/p/4419498.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!