如何绘制这个圆而不是布雷森汉姆的圆算法


int main()
{
const auto console = ::GetConsoleWindow();
const auto context = ::GetDC(console);
constexpr auto red = RGB(255, 0, 0);
constexpr auto yellow = RGB(255, 255, 0);
RECT rectClient, rectWindow;
GetClientRect(console, &rectClient);
GetWindowRect(console, &rectWindow);
int posx, posy;
posx = GetSystemMetrics(SM_CXSCREEN) / 2 - (rectWindow.right - rectWindow.left) / 2;
posy = GetSystemMetrics(SM_CYSCREEN) / 2 - (rectWindow.bottom - rectWindow.top) / 2;
const int radius = 150;
for (int y = -radius; y <= radius; y++)
for (int x = -radius; x <= radius; x++)
if (x * x + y * y <= radius * radius)
SetPixel(context, posx + x, posy + y, red);
}

它给了我这个结果img

它看起来不错,但我在侧面(上、下、右、左(看到了这个奇怪的像素img

这就是我想要的(我在顶部添加了一些像素,这样看起来更好(在此处输入图像描述

您的"我想要什么";看起来是抗锯齿的。所以绘制抗锯齿。

如果不满足原始条件,但满足x*x + y*y <= (radius+1)*(radius+1),则需要部分着色的像素。

另一种消除混叠的方法是,不是测试每个像素的中心,而是测试四个角(x\plusminus0.5,y\plusminus 0.5(。如果圆圈内有超过零个但少于四个角,则需要一个部分着色的像素。

相关内容

  • 没有找到相关文章

最新更新