计算机图形学中所有的绘制算法都是用离散的点尽可能的去逼近理想的图形,本篇为大家介绍常见的几种画线算法。

首先啰嗦一下大家都懂得直线方程,假设有直线l_{AB}

                                        y=k*x+b

x的增量\Delta x,y的增量\Delta y有这样的关系:

                                         \Delta y=k\Delta x   或

                                ​​​​​​​        ​​​​​​​ \Delta x=\frac{1}{k}\Delta y

DDA(digital differential analyzer)数字微分分析仪算法

设直线l_{AB}A(x_0,x_0)B(x_1,y_1),这里令\Delta x=x_1-x_0,\Delta y=y_1-y_0,该算法的思路如下:

        若{\color{Red} \Delta x>\Delta y},则x从x_0每次递增1,y从y_0每次递增k,并且对y进行舍入处理(四舍五入或者其他舍入规则),直到x从x_0递增到大于或等于x_1;

        若{\color{Red} \Delta y>\Delta x},则y从y_0每次递增1,x从x_0每次递增\frac{1}{k},并且对x进行舍入处理(四舍五入或者其他舍入规则),直到y从y_0递增到大于或等于y_1;

        这样就能确定该直线上每一个点的x和y的像素坐标位置。

        对应代码如下(不一定能用,主要体现算法逻辑思想,具体的实现包括细节可以有各种方式):

#include<stdlib.h>
#include<math.h>

inline int round(const float a){return int(a+0.5);}

void lineDDA(int x0,int y0,int x1,int y1)
{
    int dx=x1-x0,dy=y1-y0;
    int steps;//执行的迭代次数

    if(fabs(dx)>fab(dy)) steps=fabs(dx);
    else steps=fab(dy);
    x_increment=float(dx)/steps;
    y_increment=float(dy)/steps;
    
    float x=x0,y=y0;
    setPixel(round(x),round(y));
    for(int k=0;k<steps;++k)//迭代绘制每个对应的点
    {
        x+=x_increment;
        y+=y_increment;
        setPixel(round(x),round(y));
    }
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐