【问题标题】:Circle Rasterization Algorithm - center between pixels圆光栅化算法 - 像素之间的中心
【发布时间】:2018-04-12 21:17:05
【问题描述】:

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

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

R = 8 像素

R = 10 像素

对于中心在像素中心的圆,这不是问题,我可以使用 Bresenham 算法的通常形式:

public void checkCircle(int x0, int y0, int radius) {
    int x = radius;
    int y = 0;
    int err = -x;

    while (x > 0) {
        while (err <= 0) {
            y++;
            err += 2 * y + 1;
        }
        checkVLine(x0 + x, y0 - y, y0 + y);
        checkVLine(x0 - x, y0 - y, y0 + y);
        x--;
        err -= 2 * x + 1;
    }
    checkVLine(x0, y0 - radius, y0 + radius);
}

public void checkVLine(int x, int y0, int y1) {
    assert(y0 <= y1);
    for (int y = y0; y <= y1; y++)
        checkPixel(x, y);
}

遗憾的是,我不知道如何调整它以支持像素间圆。

【问题讨论】:

    标签: graphics geometry rasterizing bresenham


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 2018-03-31
      • 2014-09-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      相关资源
      最近更新 更多