Geometry 偶数像素直径的中点算法?

Geometry 偶数像素直径的中点算法?,geometry,bresenham,Geometry,Bresenham,使用可以绘制对称圆,每个像素只访问一次。由于该算法的性质,它只能绘制奇数直径(2*r+1)的圆。是否有可能扩展此算法,使其能够成功绘制直径为偶数像素的圆 算法的一些要求: 像素只能绘制一次 RAM非常昂贵 如果确实无法修改中点圆算法来处理此问题,则可以使用以下解决方案: void DrawCircle(int x, int y, int diameter) { if (diameter % 2 == 0) EvenWidthCircle(x, y, diameter

使用可以绘制对称圆,每个像素只访问一次。由于该算法的性质,它只能绘制奇数直径(2*r+1)的圆。是否有可能扩展此算法,使其能够成功绘制直径为偶数像素的圆

算法的一些要求:

  • 像素只能绘制一次
  • RAM非常昂贵
如果确实无法修改中点圆算法来处理此问题,则可以使用以下解决方案:

void DrawCircle(int x, int y, int diameter)
{
    if (diameter % 2 == 0)
        EvenWidthCircle(x, y, diameter / 2);
    else
        MidpointCircle(x, y, diameter / 2);
}

对于偶数直径,您可以使用中点算法,但您必须做一些修改,对于直径为8的圆,使用中点算法进行直径为7的圆,然后:

2 | 1
-----
3 | 4

对于象限1中的八分之一,什么也不做。对于2,向左移动1。对于3,向左和向下换档。对于4,向下移动,然后填充缺少的像素/块/任何你正在使用的圆。

一般的想法是将每个像素分割为2x2子像素,使其直径加倍,使其成为偶数。

显然,这与奇数直径相比,与圆的距离要小得多,但对于大多数应用来说,它应该很接近。这是绘制直径均匀的圆的常用方法吗?例如,这是GDI的
drawerlipse
背后的算法吗?老实说,我不知道;这只是我在minecraft的tekkit mod中为用海龟画圆圈而设计的解决方案,我还没有找到一种专门用于偶数圆圈的算法。从绘制椭圆的角度看,它似乎可以使用相对于边界矩形创建的圆弧上的对称性;然而,这只是一个猜测。作为一个小旁白(我还没有尝试过…),计算一个比所需直径大的奇数直径,然后移除点将其转换为一个更小的圆可能比主题中的建议更适合。真正重要的只是非常小的直径,如6/8/10,超过这一点,它将是相当难以区分。