学各种画线法和画圆法的时候学得很懵, 在网上搜, 看了很多博客, 但是很杂乱, 所以来总结一下.
Bresenham画线法

// Bresenham line
int delta_x=x2-x1, delta_y=y2-y1;
d=2*delta_y-delta_x;

if(d>=0)
{
    d+=2*delta_y-2*delta_x;
    x+=1, y+=1;
}
else    // d<0
{
    d+=2*delta_y;
    x+=1;
}

中点画线法

// 中点画线法
int delta_x=x2-x1, delta_y=y2-y1;
d=delta_x-2*delta_y;

if(d>=0)
{
    d+=-2*delta_y;
    x+=1;
}
else    // d<0
{
    d+=2*delta_x-2*delta_y;
    x+=1, y+=1;
}

Bresenham画圆法

// version 1
// 画1/8圆
d0=3-2r;		// 初始化误差

// 递推关系
if(d>=0)
{
	d+=4(x-y)+10;
	x+=1, y-=1;
}
else	// d<0
{
	d+=4x+6;
	x+=1;
}

版本2是我们教材上的代码, 在网上几乎找不到这个版本的代码(至少在我写博客时没找到)
这个版本的代码似乎是有问题的(问Deepseek这么说), 然后导致我学得有点懵
// version 2
// 画1/4圆
int x=0, y=r, dir;
int d=2-2*r;		// 初始化误差

while(y>=0)
{
    if(d<0)
    {
        if(2(d+y)-1<=0)
            dir=1;
        else
            dir=2;
    }
    else if(d>0 and 2*(d-x)-1<=0)
        dir=2;
    else
        dir=3;
    if(dir==1)
        x++, d+=2*x+1;
    if(dir==2)z
        x++,y--,d+=2*(x-y+1);
    if(dir==3)
        y--,d+=-2*y+1;
}

中点画圆法

// 中点画圆法
// 画1/8圆
d0=1-r;		// 初始化误差

// 递推关系
if(d>=0)
{
	d+=2(x-y)+5;
	x+=1, y-=1;
}
else    // d<0
{
	d+=2x+3;
	x+=1;
}

有些博客的代码里会看到e2=err*2之类的, 实际上e2=d(一般来说), 仅学习理论的时候基本不用e2, 都用的是d来表示误差项

posted on 2025-02-21 16:35  Your_Sun  阅读(25)  评论(0)    收藏  举报