计算机图形学--方法篇(DDA画线算法)

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

首先啰嗦一下大家都懂得直线方程,假设有直线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));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值