圆形光栅化算法 - 像素之间的中心

时间:2018-04-12 21:17:06

标签: graphics geometry rasterizing bresenham

我有一个问题,我必须选择部分在圆内的所有正方形(想象像素)(即使圆圈只穿过正方形的一个小角落,但如果它穿过一个角顶点则不会)。半径是像素大小的整数倍 问题是圆的中心在像素之间,即在四个像素的角顶点上 我只想访问每个像素一次。

例如,我想在以下图像中选择所有白色像素:

R = 8 px R = 8 px

R = 10 px R = 10 px

对于中心位于像素中心的圆圈,这不会有问题,我可以使用Bresenham算法的常用形式:

subprojects {
    tasks.withType(JavaCompile) {
        options.compilerArgs << '-parameters'
    }
}

可悲的是,我不知道如何调整它以支持像素间圈。

1 个答案:

答案 0 :(得分:1)

对于第一个象限 - 如果左下角位于圆圈内,则应标记单元格,因此可以使用简单循环进行栅格化

for dy = 0 to R-1
     dx = 0
     sq = R * R - dy * dy 
     while dx * dx  < sq
        mark (dx, dy)  
        mark (dx, -dy-1)  
        mark (-dx-1, dy)  
        mark (-dx-1, -dy-1)  

要填充整个水平线,您可以计算dx的最大值

for dy = 0 to R-1
     mdx = Floor(Sqrt(R * R - dy * dy))
     fill line (-mdx-1,dy)-(mdx,dy)
     fill line (-mdx-1,-dy-1)-(mdx,-dy-1)