2010-08-30 3 views
10

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

ответ

4

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

1

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

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

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

0

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

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

2

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

+0

Это то, что я делаю для симметричной линии зрения в играх. – Madmenyo

Смежные вопросы