Ультра симметричный линейный алгоритм? - PullRequest
10 голосов
/ 30 августа 2010

Я столкнулся с особым случаем, когда мне нужно создать ультрасимметричную линию или луч в двумерной сетке в порядке от (x0, y0) до (x1, y1) следующим образом:

void drawSymmetricalLine(int x0, int y0, int x1, int y1)
{
    // loop and handle each (x, y)...
}

Фактическая проблема заключается в точках, где популярные алгоритмы рисования линий НЕ рисуют обе координаты (другая помечена как x ниже), так как она кажется более толстой, что желательно в моем случае. Также производительность не важна, но простота.

Вот что я имею в виду под ультра симметричными линиями:

ox   ooo
 oo     ooo


o    o
 o    o
  o   o
       o

Ответы [ 4 ]

4 голосов
/ 30 августа 2010

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

2 голосов
/ 31 августа 2010

Визуализируйте строку дважды, один раз от p0 до p1 и снова от p1 до p0.

1 голос
/ 30 августа 2010

Если простота предпочтительнее производительности, то напишите рекурсивный алгоритм. На каждом шаге вычисляют DX = X1-X0 и DY = Y1-Y0.

Остановите рекурсию, когда DX = 0 или DY = 0 (в этом случае ваша линия вертикальная или горизонтальная).

В противном случае вычислите две «средние» конечные точки в соответствии с соотношением DX и DY и рекурсивно проведите две половины линии.

0 голосов
/ 30 августа 2010

Используйте Алгоритм линии Брезенхема , за исключением случаев, когда вы строите точку в точке (x0 + dx, y0 + dy), а также в точке (x1-dx, y1-dy). Таким образом вы обеспечите симметричность с обеих сторон.

Это немного неэффективно, но вы сказали, что это не имеет значения.

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