Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics n像素边界的圆绘制算法_Graphics - Fatal编程技术网

Graphics n像素边界的圆绘制算法

Graphics n像素边界的圆绘制算法,graphics,Graphics,我知道Bresenham和相关的算法,我发现了一个很好的算法,可以画一个1像素宽的圆。是否有任何“标准”算法可以在不恢复绘制n个圆的情况下绘制一个具有n像素宽边框的圆 绘制像素和周围的像素可能是一个解决方案,但它绘制的像素比需要的多得多 我正在为嵌入式系统编写一个图形库,所以我不想用现有的库来实现这一点,尽管一个实现这一功能且开源的库可能是一个领先者。同时计算两个半径的单个八分之一点,并同时以八种方式复制它,这就是布雷森汉姆圆通常是怎么画的。为避免过度绘制(例如,对于异或绘制),应将第二个八分之

我知道Bresenham和相关的算法,我发现了一个很好的算法,可以画一个1像素宽的圆。是否有任何“标准”算法可以在不恢复绘制n个圆的情况下绘制一个具有n像素宽边框的圆

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


我正在为嵌入式系统编写一个图形库,所以我不想用现有的库来实现这一点,尽管一个实现这一功能且开源的库可能是一个领先者。

同时计算两个半径的单个八分之一点,并同时以八种方式复制它,这就是布雷森汉姆圆通常是怎么画的。为避免过度绘制(例如,对于异或绘制),应将第二个八分之一约束为在第一个八分之一的x范围之外绘制


请注意,如果线与半径相比非常厚,则此方法将失效。

将其视为光栅化问题:

拿你的环的边界框。 考虑在边界框中出现的图像行。 对于每一行,计算与两个圆的交点(即求解x^2+y^2=r^2,因此x=sqrt(r^2-y^2),对于x,y相对于圆中心。 填写跨距。重复下一行

这种方法可以推广到各种形状,可以生成用于消除混叠的亚像素坐标,并且与涉及多个移位绘图的老套解决方案相比,随着分辨率的提高,缩放效果更好


如果嵌入式系统的sqrt看起来很可怕,请记住,有一些快速近似算法可能已经足够好了,特别是如果您要舍入到最近的像素。

您是否尝试过这种方法?对于较小的宽度,它会导致一个非常难看的圆。例如,对于宽度2,圆有时是2,但有时是1像素宽度。两个宽度太小,无法产生好的结果。您需要使用至少三个宽度,最好是四个或五个。对于非常小的厚度,您最好绘制一个半径,并将像素拉伸到所需的宽度(垂直于北/南八分之一,水平于东/西)。如果做不到这一点,反走样确实是获得良好效果的唯一方法。我确实尝试了拉伸方法,但结果非常充分。你知道有任何代码可以进行压缩和/或反走样吗?(1位b/w是否可以进行反走样?)通过使用Bresenham算法的累加器来设置边缘像素的强度,可以实现抗锯齿,但恐怕这对1位像素没有帮助。作为一个实验,我唯一能建议的另一件事是画一个大的填充白色圆圈,然后在里面画一个小的填充黑色圆圈,看看结果如何。如果是这样的话好的,那就想办法在不填充的情况下画出完全相同的像素(或者双填充是一个可以接受的解决方案)。不,出于性能原因,双填充是不可接受的。我考虑过圆内圆的方法,但它非常复杂,对于非常小的像素(1或2像素)效果不好borders.我知道那是很久以前的事了,但你还记得你最后采取的方法吗?我发现自己在嵌入式系统中也处于同样的情况。是不是有那么久了?我从来没有找到一个适合我口味的解决方案。。。