2009-09-15 2 views
3

Мне было интересно, знал ли кто-нибудь о любом алгоритме, чтобы нарисовать линию с определенной толщиной, основанную на линейном алгоритме Брешенема или любом подобном.Алгоритм линии Bresenham (толщина)

На второй мысли, я задавался вопросом о каждой SetPixel (х, у) я просто нарисовать круг, например .:

filledCircle (х, у, толщина); для каждого x, y, но это, конечно, будет очень медленным. Я также пытался использовать словарь, но это мгновенно заполнило бы память. Проверьте пиксели, которые я собираюсь нарисовать, если они имеют один и тот же цвет, но это также недостаточно эффективно для больших кистей.

Возможно, я мог бы как-то нарисовать половину кругов в зависимости от угла?

Любой вход будет оценен.

Спасибо.

дубликат:how do I create a line of arbitrary thickness using Bresenham?

+0

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

ответ

3

Вы не можете фактически рисовать круги вдоль линии. Этот подход составляет patented. :) Вы все еще можете прочитать патент на вдохновение.

+0

Это просто бумага, как насчет псевдо алгоритма? :) – 2009-09-15 15:35:19

+31

Патенты вроде этого глупы. Эти люди заслуживают расстрела. – ryeguy

+7

Какая точка патентного веб-сайта не показывает (1) дату выпуска патента и (2) дату истечения срока действия патента? –

2

Я не знаю, что обычно используется, но мне кажется, что вы можете использовать Bresenham для линии с 1 пикселем, но увеличивайте его на определенное количество пикселей по вертикали или по горизонтали. Например, предположим, что ваша линия находится примерно на 30 градусов от горизонтали, и вы хотите, чтобы она была шириной в четыре пикселя. Вы подсчитываете, что вертикальная толщина линии должна составлять пять пикселей. Вы запускаете Bresenham, но для каждого пикселя (x, y) вы фактически рисуете (x, y), (x, y + 1), ... (x, y + 4). И если вы хотите, чтобы концы линии округлялись, нарисуйте круг на каждом конце.

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

2

Существуют вариации на Bresenhams, которые вычисляют покрытие пикселей, например, используемые в библиотеках anti-grain geometry; хотите ли вы чего-то такого качества - вы не говорите, что такое выходной носитель, и большинство систем, более способных, чем встроенные ЖК-дисплеи, поддерживают ручки с толщиной в любом случае.

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