zoukankan      html  css  js  c++  java
  • CG-光栅图形学直线扫描转换算法-学习笔记

    一、直线扫描转换算法——DDA画线算法

    备注:DDA(Digital Differential Analyzer) ---> 数值微分法

    1. 引进图形学中的一个很重要的思想——增量思想

    2. 算法原理

    采用直线的斜截式方程进行推理,坐标系为光栅像素坐标系,可用坐标仅为整数坐标点。

    yi = kxi + b     

    yi+1 = kxi+1 + b = k (xi + 1) + b = kxi + k + b = kxi + b + k = yi + k

    由以上两式得:  yi+1 = yi + k (当前步的Y值等于前一步的Y值加上斜率)

    目的:将原来的乘法和加法变成了一个加法

    3. 示例

    用DDA扫描转换连接两点P0(0,0)和P1(5,3)的直线段1° 计算斜率 k = 0.6 < 1

    2° 根据公式 yi+1 = yi + k 计算趋近的像素坐标点:     

    【注意】此处Y加上0.5是做了四舍五入的处理,减少误差!

    二、直线扫描转换算法——中点画线算法

    改进:将DDA中的浮点运算变成整数加法

    1. 引入直线的一般式方程:

    F(x,y)= 0   ---->  Ax + By + C = 0

    其中:A = -(∆y);B = (∆x);C = -B(∆x);

    2. 基本数学知识:

    1° 对于直线上的点:   F(x,y)= 0

    2° 对于直线上方的点:F(x,y)> 0

    3° 对于直线下方的点:F(x,y)< 0

    3. 算法原理:每次在最大位移方向上走一步,而另一个方向是走还是不走步取决于中点误差项的判断。

    将M点的坐标代入直线方程中:

    di = F(xm, ym)= F(xi + 1, yi + 0.5)= A(xi + 1)+ B(yi + 0.5)+ C

    分三种情况:

    当 d < 0 时:M在Q下方,应取Pu

    当 d > 0 时:M在Q上方,应取Pd

    当 d = 0 时:M在直线上,选Pd或Pu均可;

    4. 引入增量思想的改进

    1° 情况1:

    推导d值的递推公式:

    d0 = F(xm0, ym0)= F(xi + 1, yi + 0.5)= A(xi + 1)+ B(yi + 0.5)+ C

    d1 = F(xm1, ym1)= F(xi + 2, yi + 1.5)= A(xi + 2)+ B(yi + 1.5)+ C

        = A(xi + 1)+ B(yi + 0.5)+ C + A + B = d0 + A + B

    2° 情况2:

    同理推导得:

    d1 = F(xi + 2, yi + 0.5)= A(xi + 2)+ B(yi + 0.5)+ C

        = A (xi + 1)+ B(yi + 0.5)+ C + A = d0 + A

    3° d的初始值的计算

    d0 = F(x0 + 1, y0 + 0.5)= A(x0 + 1)+ B(y0 + 0.5)+ C

         = Ax0 + By0 + C + A + 0.5B = A + 0.5B

    4° 综上:

    三、直线扫描转换算法——Bresenham算法

     1. 基本思想

     该算法的思想是通过各行、各列像素中心构造一组虚拟网格线,按照直线起点到中点的顺序,计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列像素中与此交点最近的像素;假设每次x+1,y的递增(减)量为0或1,它取决于实际直线与最近光栅网格点的距离,这个距离的最大误差为0.5;

     2. 原理

     误差项d的初值d0 = 0, 每一步 d = d + k,一旦d ≥1,就把它减去1,保证d的相对性,且在0、1之间。

    得到公式:

     1° 提高效率到整数加法:令 e = d - 0.5 得:

     2° 由于算法中只用到误差项的符号,于是可以用 e*2*∆x替换e;

     3. 算法步骤:

    1° 输入直线的两端点P0(x0, y0)和P1(x1, y1);

    2° 计算初始值∆x、∆y、e = -∆x, x = x0、y = y0;

    3° 绘制点(x, y);

    4° e更新为e + 2∆y,判断e的符号。若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2∆x;否则(x, y)更新为(x+1, y);

    5° 当直线没有画完时,重复步骤3和4。否则结束。

  • 相关阅读:
    2款JS脚本判断手机浏览器跳转WAP手机网站
    js实现域名判断后跳转到指定网址
    js实现网页多少秒后自动跳转到指定网址
    利用JS判断当前来路域名并跳转到指定页面
    网站建设中用JS判断时间并显示不同内容
    python 基础_列表的其他操作 4
    Codeforces Round #519 by Botan Investments
    HDU5794
    牛客网暑期ACM多校训练营(第十场)F.Rikka with Line Graph
    2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲
  • 原文地址:https://www.cnblogs.com/mzyan/p/9700836.html
Copyright © 2011-2022 走看看