學各種畫線法和畫圓法的時候學得很懵, 在網上搜, 看了很多博客, 但是很雜亂, 所以來總結一下.
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號