布雷森汉姆线算法(线条粗细)

5
我想知道是否有任何算法能够基于Bresenham的线算法或任何类似算法来绘制具有特定粗细的线条。
再考虑一下,我一直在思考对于每个setPixel(x,y),我只需绘制一个圆形,例如:
filledCircle(x,y,thickness); 对于每个x,y,但这当然会非常慢。我还尝试使用字典,但那会很快填满内存。检查我即将绘制的像素是否具有相同的颜色,但这对于大画笔来说也不够高效。
也许我可以根据角度绘制半圆?
任何意见都将不胜感激。
谢谢。
重复:如何使用Bresenham创建任意厚度的线条?

一条单像素线实际上是一个宽度为1像素的矩形。当你绘制更宽的线时,可以使用任何多边形绘制算法。这不仅会澄清线条的呈现方式,还会告诉你如何处理线帽和抗锯齿(如果你选择使用)。 - Oren Trutner
3个回答

7

你实际上不能沿着线条画圆。这种方法已经被专利了。 :) 你仍然可以阅读专利以获得灵感。


38
这样的专利很愚蠢,那些人应该被谴责。 - ryeguy
9
一个专利网站如果不显示(1)专利的授权日期和(2)专利的过期日期,那么它存在的意义在哪里? - Ben Voigt
10
不是专利,而是专利申请(尚未获得批准 - 也不应该获得批准)。 - user1693593
4
未来的更新:专利申请已被放弃 https://patents.google.com/patent/US20090096794A1/en。希望 @ryeguy 没有伤害到这些可怜的家伙。 - Gal

3
我不知道常用的方法是什么,但我认为您可以使用Bresenham算法来绘制1像素宽的线条,并在垂直或水平方向上扩展一定数量的像素。例如,假设您的线条与水平线大约成30度角,您希望其宽度为4个像素。您计算出线条的垂直厚度应为5个像素。您运行Bresenham算法,但对于每个像素(x,y),您实际上会绘制(x,y)、(x,y+1)、...(x,y+4)。如果您希望线条的端点为圆形,则在每个端点处绘制一个圆。

如果您想要过度完美,可以制作一个笔尖的像素地图(一个圆形或斜线形状),然后绘制一组平行的Bresenham线条,每个线条对应笔尖中的一个像素。


2

Bresenham算法有许多变体,例如在anti-grain geometry库中使用的像素覆盖计算方法;无论您需要什么质量 - 您没有说明输出介质是什么,而且大多数比开关式LCD更强大的系统都支持具有厚度的笔。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接