Ответ 1
Возможно, вы можете использовать алгоритм линии Bresenham и немного изменить его, чтобы при изменении шага, чтобы переместить позицию ничьей из одной строки в другую, вы нарисуйте как перед, так и после пиксели по оси y для текущей оси x.
Я столкнулся с особым случаем, когда мне нужно создать сверхсимметричную линию или луч в 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
Возможно, вы можете использовать алгоритм линии Bresenham и немного изменить его, чтобы при изменении шага, чтобы переместить позицию ничьей из одной строки в другую, вы нарисуйте как перед, так и после пиксели по оси y для текущей оси x.
Проведите линию дважды, один раз от p0 до p1 и снова от p1 до p0.
Если простота предпочтительнее производительности, то напишите рекурсивный алгоритм. На каждом этапе вычислите DX = X1-X0 и DY = Y1-Y0.
Остановить рекурсию, когда DX = 0 или DY = 0 (в этом случае ваша линия будет вертикальной или горизонтальной).
В противном случае вычислите две "средние" конечные точки в соответствии с четностью DX и DY и рекурсивно выведите две половинные строки.
Используйте Bresenham алгоритм линии кроме случаев, когда вы участка точку в точке (x0 + Dx, y0 + Dy), а также построить точку в точке ( x1-dx, y1-dy). Таким образом, вы гарантируете, что он симметричен с обеих сторон.
Это немного неэффективно, но вы сказали, что это не имеет значения.