Как нарисовать этот круг вместо алгоритма круга Брезенхэма

#visual-c

#visual-c

Вопрос:

 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, amp;rectClient);
    GetWindowRect(console, amp;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

и это то, что я хочу (я добавил несколько пикселей вверху, чтобы это выглядело лучше) введите описание изображения здесь

Ответ №1:

Ваше «то, что я хочу» выглядит сглаженным. Так что рисуйте сглаженным.

Если исходное условие не выполнено, но x*x y*y <= (radius 1)*(radius 1) выполнено, то вам нужен частично затененный пиксель.

Другой способ выполнить сглаживание — проверить не центр каждого пикселя, а четыре угла (x plusminus 0,5, y plusminus 0,5). Если внутри круга больше нуля, но меньше четырех углов, вам нужен частично затененный пиксель.

Комментарии:

1. Войт, не могли бы вы показать это в коде? Я не знаю, что ты имеешь в виду