学各种画线法和画圆法的时候学得很懵, 在网上搜, 看了很多博客, 但是很杂乱, 所以来总结一下.
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来表示误差项
浙公网安备 33010602011771号