【问题标题】:circle drawing algorithm for n-pixel bordern像素边框的画圆算法
【发布时间】:2011-11-14 13:21:27
【问题描述】:

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

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

我正在为嵌入式系统编写一个图形库,因此我不是在寻找一种使用现有库的方法来完成此任务,尽管执行此功能并且是开源的库可能是一个领先者。

【问题讨论】:

  • 我知道那是很久以前的事了,但您还记得您最终采用的方法吗?我发现自己在嵌入式系统中处于同样的境地。
  • 又是那么久吗?我从来没有找到适合我口味的解决方案......

标签: graphics


【解决方案1】:

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

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

【讨论】:

  • 你试过这个吗?对于小宽度,它会导致一个非常丑陋的圆圈。例如宽度为 2 的圆有时是 2,但有时是 1 像素宽度。
  • 2 的宽度太小,无法产生好的结果。您需要使用至少三个的宽度,最好是四个或五个。对于非常小的厚度,您最好绘制一个半径并将像素拉伸到所需的宽度(垂直用于北/南八分圆,水平用于东/西)。如果做不到这一点,抗锯齿确实是获得良好效果的唯一方法。
  • 我确实尝试了拉伸方法,但结果很糟糕。你知道任何可以进行strteching和/或抗锯齿的代码吗? (抗锯齿是否可以使用 1 位黑白??)
  • 抗锯齿可以通过使用 Bresenham 算法的累加器来设置边缘像素的强度来实现,但恐怕这对 1 位像素没有帮助。我唯一能建议的另一件事——作为一个实验——是画一个大的实心白色圆圈,然后在里面画一个小的实心黑色圆圈,看看结果如何。如果看起来没问题,那么想办法在不填充的情况下绘制完全相同的像素(或者双重填充是可以接受的解决方案)。
  • 不,出于性能原因,双重填充是不可接受的。我已经考虑过圆内圆的方法,但它非常复杂,不适用于非常小的(1 或 2 像素)边框。
【解决方案2】:

将其视为光栅化问题:

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

这种方法可以推广到各种形状,可以生成可用于抗锯齿的亚像素坐标,并且与涉及多个移位绘制的 hacky 解决方案相比,随着分辨率的提高可以更好地缩放。

如果对于嵌入式系统来说 sqrt 看起来很吓人,请记住,有一些快速的近似算法可能已经足够好了,尤其是在四舍五入到最近的像素时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多