我想将2d甜甜圈光栅化为矩阵/像素(结果应该是一个填充的甜甜圈)。
甜甜圈由r1,r2,x0,y0定义。
我怀疑最佳解决方案是Bresenham算法的一些功能https://en.wikipedia.org/wiki/Midpoint_circle_algorithm
有什么想法吗?
答案 0 :(得分:0)
是的,可以用Bresenham圈或Midpoint算法填充甜甜圈。
开始第一象限的内圈和外圈的平行步行。当Y改变时建立水平段。当达到顶部并且继续外部圆圈时,停止走向内圈。
请注意,您必须记住第一个(最大)外部X值,但是必须记住同一个Y的最后一个(最小)内部X值。
答案 1 :(得分:0)
Bresenham现在远非最佳......如何利用循环方程:
(x-x0)^2 + (x-y0)^2 = r^2
所以让我们:
x0,y0 - center
r1 - outer radius
r2 - inner radius
r1<=r2
xs,ys - screen resolution
scr[ys][xy] - screen matrix
C ++ 中的看起来像这样:
int x,y,xx,yy,rr,rr1=r1*r1,rr2=r2*r2;
for (y=y0-r1;y<=y0+r1;y++) // loop all y positions
if ((y>=0)&&(y<ys)) // clip to screen
for (yy=y-y0,yy*=yy,x=x0-r1;x<=x0+r1;x++) // loop all x positions
if ((x>=0)&&(x<xs)) // clip to screen
{
xx=x-x0; xx*=xx; rr=xx+yy;
if ((rr>=rr2)&&(rr<=rr1)) // is in between radiuses?
scr[y][x]=fill_color;
}
您可以通过预先计算屏幕内两个循环的边界来轻松删除屏幕剪辑if
语句...
对于填充圆圈来说,这种方法通常比Bresenham更快,更不用说易于并行了。