hor*_*guy 24 algorithm graphics
我目前正在使用Bresenham的算法绘制线条,但它们(当然)厚度为一个像素.我的问题是绘制任意厚度线条的最有效方法是什么?
我使用的语言是C.
Ski*_*izz 10
我认为最好的方法是绘制一个矩形而不是一条线,因为宽度为一条线的线是一个二维对象.要绘制一组平行线以避免过度绘制(以减少写入带宽)和欠拉(丢失像素)将非常复杂.从起点和终点以及宽度计算矩形的角点并不太难.
因此,在下面的评论之后,执行此操作的过程将是: -
注意*:如果您正在使用OpenGL,您也可以同时执行步骤2.当然,使用OpenGL确实意味着理解OpenGL(大而复杂),并且这个应用程序可能会在开发的这个后期阶段实现这个棘手的事情.
这是一篇论文和Delphi实现的Bresenham算法的修改版本,用于绘制加粗线条.
您可能还想看看Anti-Grain Geometry,这是一个用于2D图形的高质量和高性能软件渲染的库.看看演示页面,了解它可以做什么.
为了获得最佳精度,尤其是较粗线条的良好性能,您可以将线条绘制为多边形.一些伪代码:
draw_line(x1,y1,x2,y2,thickness)
Point p[4];
angle = atan2(y2-y1,x2-x1);
p[0].x = x1 + thickness*cos(angle+PI/2);
p[0].y = y1 + thickness*sin(angle+PI/2);
p[1].x = x1 + thickness*cos(angle-PI/2);
p[1].y = y1 + thickness*sin(angle-PI/2);
p[2].x = x2 + thickness*cos(angle-PI/2);
p[2].y = y2 + thickness*sin(angle-PI/2);
p[3].x = x2 + thickness*cos(angle+PI/2);
p[3].y = y2 + thickness*sin(angle+PI/2);
draw_polygon(p,4)
Run Code Online (Sandbox Code Playgroud)
并且可选地,可以在每个端点处绘制圆圈.
一些简单的使用路线:
创建几乎任意粗细的线的最简单方法是首先进行 bresenham,然后根据需要应用任意数量的膨胀迭代。每个扩张均等地填充线的两侧。
编辑:还值得注意的是,这种方法具有易于推广到 3D 的良好特性,因为 Bresenham 和扩张都很容易推广到 3D。
布雷森汉姆?厚度1:
扩张掩码:
0 1 0
1 1 1
0 1 0
Run Code Online (Sandbox Code Playgroud)
Bresenham + 1 扩张?厚度 2
Bresenham + 2 次扩张?厚度 3
等等。