Ультрасимметричный линейный алгоритм?

Я столкнулся с особым случаем, когда мне нужно создать сверхсимметричную линию или луч в 2D-сетке в порядке от (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

Ответ 1

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

Ответ 2

Проведите линию дважды, один раз от p0 до p1 и снова от p1 до p0.

Ответ 3

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

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

В противном случае вычислите две "средние" конечные точки в соответствии с четностью DX и DY и рекурсивно выведите две половинные строки.

Ответ 4

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

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