【问题标题】:How to draw a filled circle?如何画一个实心圆?
【发布时间】:2013-10-08 21:24:43
【问题描述】:

我正在使用我的 C 代码根据规范创建位图/bmp 文件,我想在我的位图上绘制简单的图元。以下代码显示了我如何在位图上绘制一个矩形:

if(curline->type == 1) // draw a rectangle
{
    int xstart = curline->x;
    int ystart = curline->y;
    int width = curline->width + xstart;
    int height = curline->height + ystart;

    int x = 0;
    int y = 0;

    for(y = ystart; y < height; y++)
    {
      for(x = xstart; x < width; x++)
      {
        arr[x][y].blue = curline->blue;
        arr[x][y].green = curline->green;
        arr[x][y].red = curline->red;
      }
    }

    printf("rect drawn.\n");
}

...
save_bitmap();

示例输出:

所以基本上我是在给定 x 和 y 字段内的所有像素设置红色、绿色和蓝色值。

现在我想通过知道圆的中点和半径来填充圆。但是我怎么知道哪些像素在这个圆圈内,哪些像素不在?任何帮助将不胜感激,感谢阅读。

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    如果点到圆心的距离小于圆的半径,则该点位于圆的边界内。

    考虑一个点 (x1,y1) 与一个圆心 (x2,y2) 和半径 r 的比较:

    int dx = x2 - x1; // horizontal offset
    int dy = y2 - y1; // vertical offset
    if ( (dx*dx + dy*dy) <= (r*r) )
    {
        // set pixel color
    }
    

    【讨论】:

    • 谢谢,这工作完美无缺。我从没想过计算要填充的像素会这么容易!
    • 作为练习,您可能想尝试对边缘进行抗锯齿处理。这意味着要考虑像素的宽度,并在像素非常靠近但不完全在圆内时对边界进行着色。
    【解决方案2】:

    您也可以尝试中点算法,维基百科上的here

    【讨论】:

    • 感谢这个有用的链接,+1!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多