2011-09-10 30 views
1

我知道bressenham和相关算法,并且我找到了一个很好的算法来绘制一个具有1像素宽边框的圆。是否有任何“标准”算法绘制一个具有n像素宽边框的圆,而不恢复为绘制n个圆?n像素边框的圆形绘制算法

绘制像素和n^2个周围的像素可能是一个解决方案,但它绘制比需要更多的像素。

我写一个嵌入式系统中的图形库,所以我不是在寻找一种方式来做到这一点使用现有的库中,虽然做这个功能是开源的可能是一个领先的库。

+0

我知道这是很久以前的事了,但是你还记得你最终采取的方法吗?我发现自己在嵌入式系统中处于相同的状况。 –

+0

是不是很久啊?我从来没有找到一个解决方案,足以满足我的口味... –

回答

1

计算为在同一时间一个八分两个半径点,并同时复制它八种方式,这是多么布氏界通常反正绘制。为了避免透支(例如XOR绘图),第二个八分圆应该限制在第一个八分圆的x范围之外。

请注意,如果线条与半径相比非常厚,则此方法会崩溃。

+0

你有没有试过这个?对于较小的宽度,会导致一个非常丑陋的圆圈。例如,对于宽度2,圆有时会是2,但有时是1像素的宽度。 –

+0

两个宽度太小而不能产生好的结果。您需要使用至少三个宽度,最好是四个或五个宽度。对于非常小的厚度,绘制单个半径并将像素拉伸至所需宽度(垂直于北/南八分圆,水平向东/西)可能会更好。否则,反锯齿就是取得好成绩的唯一途径。 –

+0

我确实尝试了拉伸方法,但结果很糟糕。你知道有哪些代码可以实现保留和/或反走样吗? (抗锯齿可以用1位b/w来表示) –

1

将它当作光栅化问题处理:

取出环的边界框。 考虑图像行落在边界框中。 对于每一行,计算与2个圆的交点(即求解x^2 + y^2 = r^2,所以x = sqrt(r^2-y^2)圆心。 填写跨度。重复下一行。

这种方法推广到各种形状,可产生对抗锯齿的子像素坐标有用的,比涉及多个移动哈克解决方案,提高分辨率缩放更好平局。

如果开方看上去很恐怖的嵌入式系统,牢记有快速近似算法,它很可能是不够好,特别是如果你四舍五入至最近的像素。