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


    本文是对 赵明老师 《计算机图形学》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 算法:

      

      

      

      

      

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

      

      

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

      

      

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

  • 相关阅读:
    12306.cn网站自动登录器源代码
    从IL看C#
    CanvasRenderingContext2Dhtml5的关键
    慎用Response.Write()
    JPanel 的getGraphics
    怎么用swing绘图
    Win7 双硬盘启动出错处理
    paint repaint实现动画
    多线程一例
    画图,橡皮
  • 原文地址:https://www.cnblogs.com/maples7/p/4419498.html
Copyright © 2020-2023  润新知