Все точки пересечены линией - PullRequest
0 голосов
/ 04 мая 2011

Мне нужно найти все точки на линии. Я попробовал алгоритм Брезенхэма, но он не работает в следующем случае:

 (0, 0)
.-----------+-----------+-----------.
|...........|           |           |
|...........|           |           |
|.....XXXX..|           |           |
|........XXXX           |           |
|...........XXXXX       |           |
+-----------+---XXXX----+-----------+
|           |......XXXXX|...........|
|           |..........XXXX.........|
|           |...........|.XXXXX.....|
|           |...........|...........|
|           |...........|...........|
`-----------+-----------+-----------´
                              (2, 1)

X - фактическая строка, . - это то, что возвращает алгоритм Брезенхэма, обратите внимание, что линия пересекает (1, 0), но она не отмечена.
Как я могу найти все пиксели, через которые проходит линия? Мне не нужен этот псевдоним, поэтому я считаю, что алгоритм Ву - это избыточное убийство. Конечные точки линии находятся в середине пикселей.

Для ссылки на алгоритм, который у меня есть:

int dx = System.Math.Abs(x0 - x1);
int dy = System.Math.Abs(y0 - y1);

int sx = x0 < x1 ? 1 : -1;
int sy = y0 < y1 ? 1 : -1;

int err = dx - dy;

int lx = x0;
int ly = y0;

for(int i = 0; true; i++)
{
    Mark(x0, y0);

    if(x0 == x1 && y0 == y1)
        break;

    int e2 = err * 2;
    if(e2 > -dy)
    {
        err -= dy;
        x0 += sx;
    }
    if(e2 < dx)
    {
        err += dx;
        y0 += sy;
    }
}

1 Ответ

1 голос
/ 04 мая 2011

Хорошо, просто реализуйте очевидный простой алгоритм: начните с одного конца линии, найдите, с какой стороны начальный квадрат пересекается, прыгните на соответствующий соседний квадрат ... и так далее.Идите, пока не дойдете до финишной площади.

Самый простой способ реализовать это в целых числах - это переключиться на суперпиксельную точность: просто умножить все на постоянный коэффициент.Трудная часть начинается, когда вы обнаруживаете, что у вас недостаточно целочисленного диапазона для его умножения в достаточной степени ... Я не знаю, так ли это в вашем случае.

...