2015-04-20 3 views
0

Я ищу алгоритм рисования линии, который отображает только один пиксель на строку scanline/row и использует только целые числа.Алгоритм рисования линии с одним пикселем на сканирующую линию

Алгоритм рисования линии Bresenham работает в большинстве случаев, но он отображает два пикселя на линию сканирования, когда у меня есть линия от P1 (40, 0) до P2 (0, 20), где Pn (x, y).

Для записи я кодирую в C для микроконтроллера низкого уровня без блока с плавающей точкой.

Спасибо!

+4

А что вы хотите, если у вас есть горизонтальная (или почти горизонтально) линия? Алгоритм Брешенема показывает несколько пикселей в строке, если это то, что требуется для получения хорошего представления. Каждый раз, когда разница между X1 и X2 больше расстояния между Y1 и Y2, вы получите несколько пикселей на одной или нескольких линиях сканирования. Похоже, что вы можете легко изменить свою реализацию Bresenham, чтобы отслеживать позицию Y последнего пикселя, и не строить следующий пиксель, если это то же самое Y-координата. –

+0

Вот как я реализовал, но я подумал, что это может быть какой-то алгоритм, который быстрее, чем мой модифицированный Bresenham. Потому что я не могу быть первым, кому нужен такой алгоритм рисования линии. И для вашего вопроса он должен отображать только один пиксель для горизонтальной линии. –

ответ

0

Чтобы имитировать плавающую точку, вы можете масштабировать целые числа, поэтому вместо «1» у вас есть «1000», где вы представляете себе плавающую точку после третьей цифры слева. Затем вы выполняете алгоритм Брешенема в целом по этим масштабированным значениям. После вычисления вы де-масштабируете с помощью целочисленного деления с этим максимумом. Вы можете округлить. Вы должны определить максимальное значение x и правильно выбрать шкалу. Используя силу 2, вы можете использовать сдвиг вместо разделения.

Для этого будет только один пиксель в строке, вы можете использовать значение отсечки, где ниже не будет рисовать пиксель и выше. Пиксель должен быть черным (или белым), но градиентов нет (так как в противном случае вам нужны два пикселя).

+0

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

+0

Я сказал: используйте Brensham, но используя целочисленную арифметику. Это всегда быстрее, чем с плавающей запятой. Вы сказали, что у вас нет FPU. –

+0

Извините, извините! Я спешил до ... Anywho, похоже, я придерживаюсь Брешенема с y-модификацией. Но я все еще удивляюсь, если я единственный, кто хочет этот алгоритм рисования линии. Он не чувствует себя оптимизированным. И я считаю, что такой алгоритм был полезен еще в восьмидесятые годы, когда люди хотели нарисовать полигоны с co-cpus. –

0

Знакомства http://en.wikipedia.org/wiki/Bresenham «s_line_algorithm:

... Это приводит к алгоритму, который использует только целочисленную арифметику.“

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