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


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

      

      

      

      

      

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

      

      

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

      

      

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

  • 相关阅读:
    收藏文章
    Python __func__
    Python 可变对象 & 不可变对象
    Kafka SASL ACL配置踩坑总结
    C++ 传递动态内存
    负数取反,单目运算“-”的运算
    C++重载运算符的理解
    c++ 随机函数用法
    static变量
    路由汇聚及其相关计算
  • 原文地址:https://www.cnblogs.com/maples7/p/4419498.html
Copyright © 2020-2023  润新知