Алгоритм Scanline: вычисление x ребер

Я пытаюсь реализовать алгоритм scanline в Javascript. Похоже, мое вычисление х неверно, так как линии короткие или длинные.

Эти края должны быть заполнены:

Вот как мой код сканлайна заполняет его:

Моя таблица ребер имеет следующие поля:

et.push({
    Ymin: Ymin, // minimum Y of the edge
    Ymax: Ymax, // maximum Y
    x: Xmin, // X value of Ymin point; updated for every scanline
    dx: Xmax - Xmin, // Delta X
    dy: Ymax - Ymin // Delta Y
});

Новый X после каждой строки сканирования рассчитывается следующим образом:

// aet is active edge table
if (aet[i].dx != 0 && aet[i].dy != 0) {
    // this is not a vertical edge
    var incr = aet[i].dy / aet[i].dx; // =1/(dx/dy) ... dx/dy=m
    if (aet[i].dy > 0) {
        incr = incr;
    } else {
        incr = -incr;
    }
    aet[i].x += incr;
}

Что не так в этом расчете?

1 ответ

Решение

Вы не показываете правильный алгоритм линии сканирования, но выглядит так, как будто вы хотите обработать все строки сканирования из Ymin в Ymax, y начинает Ymin и увеличивается на единицу для каждой линии сканирования.

Следовательно x для каждой сканы должна увеличиваться на dx/dy,

Вам, вероятно, не нужно корректировать знак. Вместо этого знак dy положительный или отрицательный:

m = dx / dy                               # slope of the line
x[y + 1] = x[y] + m * dy = x[y] + m       # dy == (y + 1) - y == 1
x[y - 1] = x[y] + m * dy = x[y] - m       # dy == (y - 1) - y == -1

Вы сканируете в x направление и, следовательно, исключить горизонтальные линии, для которых dy == 0, Это также показывает в вашей математике: вы не можете делить на dy когда dy == 0,

Другие вопросы по тегам