как я создаю строку произвольного использования толщины Bresenham?

5 ответов

Я думаю, что лучший способ - нарисовать прямоугольник, а не линию, поскольку линия с шириной - это двумерный объект. Попытка нарисовать набор параллельных линий, чтобы избежать перерисовки (чтобы уменьшить пропускную способность записи) и перерисовки (отсутствующие пиксели), была бы довольно сложной. Нетрудно вычислить угловые точки прямоугольника из начальной и конечной точек и ширины.

Итак, следуя комментарию ниже, процесс для этого будет: -

  1. Создать прямоугольник такой же длины, как требуемая линия и ширина, равная требуемой ширине, так (0, 0) - (ширина, длина)
  2. Повернуть и перевести координаты углов прямоугольников в нужное положение с помощью двумерного преобразования
  3. Растеризовать повернутый прямоугольник либо с помощью аппаратного ускоренного рендерера (четырехугольник OpenGL) например *) или используйте программный растеризатор. Он может быть визуализирован с использованием четырехугольного растеризатора или пары треугольников (например, вверху слева и внизу справа).

Примечание *: Если вы используете OpenGL, вы также можете выполнить Шаг 2 одновременно. Конечно, использование OpenGL действительно означает понимание OpenGL (большого и сложного), и это приложение может сделать это сложной задачей для реализации на столь позднем этапе разработки.

10
ответ дан Skizz 28 November 2019 в 22:51
поделиться

Вот статья и реализация Delphi модифицированной версии алгоритма Брезенхема для рисования утолщенных линий.

Возможно, вы также захотите взглянуть на Anti-Grain Geometry , библиотеку для высококачественного и высокопроизводительного программного рендеринга 2D-графики. Взгляните на демонстрационную страницу , чтобы понять, на что она способна.

9
ответ дан Martin B 28 November 2019 в 22:51
поделиться

Некоторые простые маршруты для использования:

  1. для любой ширины n, где n нечетно. для любой построенной точки p также нарисуйте точки выше / ниже ее для n / 2 (если линия имеет угол> 45 градусов, рисуйте из стороны в сторону).
    • не совсем правильная линия правильной толщины, скорее как курсив, но очень быстрая.
  2. для начальной точки p (x, y) выбирают точки t0 и b так, чтобы они центрировались на p, но на расстоянии n пикселей. для конечной точки сделайте то же самое, что приведет к t1 b1. Нарисуйте линии от t0 -> t1, t1-> b1, b1 -> t0, b0 -> t1. Заполните полученный прямоугольник.
    • Хитрость в том, чтобы подобрать точки так, чтобы они казались ортогональными к направлению пути.
  3. для каждой точки p на линии вместо рисования точки нарисуйте круг.
    • Это имеет преимущество в том, что конечные точки должны быть «чистыми» независимо от ориентации.
    • не должно быть необходимости делать какие-либо круги сплошными, кроме первых.
    • несколько медленно
4
ответ дан ShuggyCoUk 28 November 2019 в 22:51
поделиться

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

РЕДАКТИРОВАТЬ : Стоит также отметить, что этот метод имеет приятную особенность, заключающуюся в том, что его легко обобщить в 3D, потому что и Брезенхем, и дилатация легко обобщаются в 3D.

Толщина 1:

enter image description here

Маска:

1 1 1
1 1 1
1 1 1

Итоговая толщина: 3

enter image description here

Маска:

0 1 0
1 1 1
0 1 0

Итоговая толщина: 2

enter image description here

2
ответ дан x squared 28 November 2019 в 22:51
поделиться

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

Не пробовал.

Конечные точки могут потребовать некоторого внимания, чтобы они не выглядели странно обрезанными.

2
ответ дан 28 November 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: