Фиксация приближений алгоритма растеризации линий - PullRequest
0 голосов
/ 24 января 2019

В настоящее время я делаю заголовок для создания простой графики в консоли c ++.2 дня назад я добавил функцию рисования линий с использованием алгоритма растеризации, используемого здесь .

Но у меня есть проблема: поскольку декартова плоскость консоли работает только с целыми числами, моя функция неНарисуйте anithing, когда числа, приведенные, если приближены, равны 0, поэтому я бродил, если вы могли бы сделать что-то вроде этого:

if ( y == 0 ) 
{ 
    //fix using some kind of 'forecast' of what y could be
}

так вот мой код:

void Engine::line(int ax, int ay, int bx, int by, int color)
{

    int i = 0;

    if(ax < bx)
        i = 1;
    if(ax > bx)
        i = -1;


    int dx = bx - ax;
    int dy = by - ay;

    for (int x = ax; x != bx; x+=i)
    {
        int y = ay + (by - ay) * (x - ax)/(bx - ax);

        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, color);

        Engine::gotoxy(x,y); printf("%c", 219);
    }
}

Ивот мой вывод, где, если линия сильно наклонена, она не отображается должным образом: image

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

Ответы [ 2 ]

0 голосов
/ 24 января 2019

С помощью того же алгоритма вы можете повысить точность, сначала вычислив y в формате с плавающей запятой, а затем округлите его до ближайшего целого числа.Это можно сочетать с предыдущим ответом.

0 голосов
/ 24 января 2019

Традиционный подход - написать свой алгоритм 2, 4 или 8 раз в зависимости от октанта диагонали, которую вы хотите нарисовать. в основном, когда | dx | > | DY | Вы шагаете на 1 в х. Когда | DX | <| DY | Вы шагаете на 1 в y. </p>

Что касается того, что вы сделали в цикле, это выглядит так же, как и для шестого уравнения в вики для Брезенхэма, и все должно быть в порядке, потому что вы делаете все свои умножения до всего своего деления, но делаете все эти умножения и делит, чего избегают фрагменты латакода. Возможно, вам потребуется увеличить толщину в полпикселя.

Возможно, вы также захотите взглянуть на трюк Wu antialias, который использует остаток с плавающей точкой для затенения 2 перекрывающихся пикселей, хотя, как вы потом примените это к текстовому режиму, ваша проблема, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...