Алгоритм линии Брезенхема (толщина)
Мне было интересно, знает ли кто-нибудь какой-либо алгоритм для рисования линии с определенной толщиной, основанный на алгоритме линии Брезенхэма или подобном.
Во-вторых, мне было интересно, для каждого setPixel(x,y) я просто нарисую круг, например:
filledCircle (х, у, толщина); для каждого х, у, но это, конечно, будет очень медленно. Я также пытался использовать словарь, но это быстро заполнило бы память. Проверьте пиксели, которые я собираюсь нарисовать, если они имеют одинаковый цвет, но это также недостаточно эффективно для больших кистей.
Возможно, я мог бы как-то нарисовать полукруги в зависимости от угла?
Любой вклад будет оценен.
Благодарю.
Дубликат: как создать линию произвольной толщины, используя Брезенхем?
3 ответа
Вы не можете нарисовать круги вдоль линии. Этот подход запатентован.:) Вы все еще можете прочитать патент на вдохновение.
Я не знаю, что обычно используется, но мне кажется, что вы можете использовать Bresenham для линии шириной в 1 пиксель, но расширить ее на определенное количество пикселей по вертикали или горизонтали. Например, предположим, что ваша линия примерно на 30 градусов от горизонтали, и вы хотите, чтобы она была шириной в четыре пикселя. Вы вычисляете, что вертикальная толщина линии должна составлять пять пикселей. Вы запускаете Bresenham, но для каждого пикселя (x,y) вы фактически рисуете (x,y), (x,y+1), ... (x,y+4). И если вы хотите, чтобы концы линии были закруглены, нарисуйте круг на каждом конце.
Для перебора создайте карту пикселей стилуса (круг или диагональное перо или что-то еще), затем нарисуйте набор параллельных линий Брезенхэма, по одной на каждый пиксель в стилусе.
Существуют вариации в Bresenhams, которые рассчитывают покрытие пикселей, например, используемые в библиотеках антизернистой геометрии; хотите ли вы что-то такого качества - вы не говорите, что такое выходной носитель, и большинство систем, более способных, чем LCDS, в любом случае поддерживают толщину ручек.