直线的生成的两种算法

1 DDA算法(数字微分分析法):

1.1算法思想:

从直线段的起点像素出发,依据直线的微分方程确定描述直线的各个像素点

1.2 算法原理:

直线的起点(xs,ys)

终点:(xe,ye)

变化量为cx=xe-xs,cy=ye-ys;我们将变化时间设为ct.

则有:

    x[i+1]=x[i]+cx/ct;

    y[i+1]=y[i]+cy/ct;

1.3 算法描述:

void drawline(int xs,ys,xe,ye)
{
    int k,i,x,y,dx,dy;
    k=abs(xe-xs);
    if(k<abs(ye-ys))
    {
        k=abs(ye-ys);//求最大值
    }
    dx=(xe-xs)/k;
    dy=(ye-ys)/k;
    x=xs;
    y=ys;
    for(i=0;i<k;i++)
    {
        plot(x,y);//画点
        x=x+dx;//下一个像素点
        y=y+dy;
    }
}

算法特点:

原理简单很容易实现,但是计算取整的积累会使得线段和理想的线段有所偏差:


2 Bresenham算法:

2.1 算法思想

    根据直线的斜率确定选择x或y方向作为计长方向在这个方向上每次递增一个单位,另一个单位通过比较来确定是否增加一个单位

2.2 算法原理:

在斜率为0~1的1条件下,假设咱们选择以x轴为计长方向,p(xi,yi)是已经选定的距离直线最近的像素,现在要决定pi+1是选择T还是s.


显然,要是e=d-0.5<0,则Pi+1(xi+1,yi)

否则Pi+1(xi+1,yi+1);

为了简便计算,咱们将e替换为:

e=2edx;

然后咱们得出递推公式:


3 算法描述:

void drawline(int xs,ys,xe,ye)
{
    int i,x,y,dx,dy,e;
    dx=xe-xs;
    dy=ye-ys;
    e=-dx;
    x=xs;
    y=ys;
    for(i=0;i<dx;i++)
    {
        plot(x,y);
    }
    if(e>0)
    {
        y=y+1;
        e=e-2*dx;
    }
    x=x+1;
    e=e+2*dx;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值