Упрощенный линейный алгоритм Брезенхема: что он * точно * делает?

На основе статьи Википедии о Линейный алгоритм Брезенхема. Я реализовал описанную здесь упрощенную версию , моя реализация на Java выглядит так:

int dx = Math.abs(x2 - x1);
int dy = Math.abs(y2 - y1);

int sx = (x1 < x2) ? 1 : -1;
int sy = (y1 < y2) ? 1 : -1;

int err = dx - dy;

while (true) {
    framebuffer.setPixel(x1, y1, Vec3.one);

    if (x1 == x2 && y1 == y2) {
        break;
    }

    int e2 = 2 * err;

    if (e2 > -dy) {
        err = err - dy;
        x1 = x1 + sx;
    }

    if (e2 < dx) {
        err = err + dx;
        y1 = y1 + sy;
    }
}

Теперь я понимаю, что err управляет соотношением шагов на x- ось по сравнению с шагами по оси Y - но теперь, когда я должен документировать, что делает код, я не могу четко выразить, для чего он нужен и почему именно if-операторы, как они есть и почему err изменено так, как показано в коде.

Википедия не указывает на какие-либо более подробные объяснения или источники, поэтому мне интересно:

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

12
задан riwi 13 November 2011 в 18:19
поделиться