【发布时间】:2014-03-13 13:05:29
【问题描述】:
我正在尝试实现 Bresenham 算法以获得类似的东西:
因此,我主要测试了很多算法,例如:
line(ushort x0, ushort y0, ushort x1, ushort y1, const Color couleur)
int dx = abs(x1-x0);
int dy = abs(y1-y0);
int sx,sy;
sx=sy=0;
if(x0 < x1) sx = 1;
else sx = -1;
if(y0 < y1) sy = 1;
else sy = -1;
int err = dx-dy;
while(1)
{
pixel(x0, y0) = couleur;
if(x0 == x1 && y0 == y1) break;
int e2 = 2* err;
if(e2 > -dy)
{
err = err - dy;
x0 = x0 + sx;
}
if(e2 < dy)
{
err = err + dx;
y0 = y0 + sy;
}
}
或者
ushort x=x1;
ushort y=y1;
int longX=x2-x1;
int longY=y2-y1;
if(longY<longX)
{ // 1er Octant
const int c1=2*(longY-longX);
const int c2=2*longY;
int critère=c2-longX;
while(x<=x2)
{
DessinePoint(x,y,couleur);
if(critère>=0)
{ // changement de ligne horizontale
y++;
critère=critère+c1;
}
else
// toujours la même ligne horizontale
critère=critère+c2;
x++; // ligne suivante, et recommence
}
}
else
{ // 2eme Octant
const int c1=2*(longX-longY);
const int c2=2*longX;
int critère=c2-longY;
while(y<=y2)
{
DessinePoint(x,y,couleur);
if(critère>=0)
{ // changement de ligne verticale
x++;
critère=critère+c1;
}
else
// toujours la même ligne verticale
critère=critère+c2;
y++; // ligne suivante, et recommence
}
}
两个八分圆。
我也尝试了我们可以在维基百科中找到的内容,但没什么特别的。
我尝试实现的最后一个功能:
line(ushort xi, ushort yi, ushort xf, ushort yf, const Color couleur)
{
int dx,dy,i,xinc,yinc,cumul,x,y ;
x = xi ;
y = yi ;
dx = xf - xi ;
dy = yf - yi ;
xinc = ( dx > 0 ) ? 1 : -1 ;
yinc = ( dy > 0 ) ? 1 : -1 ;
dx = abs(dx) ;
dy = abs(dy) ;
pixel(x,y)= couleur;
if ( dx > dy )
{
cumul = dx / 2 ;
for ( i = 1 ; i <= dx ; i++ )
{
x += xinc ;
cumul += dy ;
if ( cumul >= dx )
{
cumul -= dx ;
y += yinc ;
}
pixel(x,y) = couleur ;
}
}
else
{
cumul = dy / 2 ;
for ( i = 1 ; i <= dy ; i++ )
{
y += yinc ;
cumul += dx ;
if ( cumul >= dy )
{
cumul -= dy ;
x += xinc ;
}
pixel(x,y) = couleur ;
}
}
那么,有人知道任何解决方案吗?
【问题讨论】:
-
具体问题是什么?你是写了这些函数,还是只是在某个地方找到了它们?参考资料会比复制粘贴更有用,但我们想知道您尝试了什么。
-
我尝试并实现了所有这些功能。我找到了它们并对其进行了改编。
-
嗯,样本之间的书写风格差异很大。无论如何,那么,具体问题是什么?您特别想解决什么问题?这里完全没有提到问题。
-
问题是我想画这个圆,但我做不到。这就是我写它们的方式:
for(int angle=0; angle < 360; angle +=5) { int x = cos(convertToRadian(angle))*rayon; int y = sin(convertToRadian(angle))*rayon; ptrColor->line(250, 250, x, y, Color(0,0, 220)); }250 是中心 -
嗯,如果有
sin和cos,那不是布雷森汉姆的圆算法。我很困惑,因为您正在讨论八分圆,但代码仅适用于 Bresenham 的线算法。 “我不能”仍然完全不明确;如果你不明白自己在做什么,那就不是真正的编程。
标签: c++ algorithm bresenham generalization