如何测试像素是否在圆圈上?

时间:2014-04-04 14:19:23

标签: algorithm drawing geometry

我试图通过检查图像上的每个像素是否在形状上来绘制形状。

我已经尝试过制作圈子了:

public static boolean paintCircle(int x, int y, int r){
    for (int i=0;i<width;++i)
        for (int j=0;j<height;++j)
            if (isOnCircle(i,j,x,y,r))
                putpixel(i,j);
}

isOnCircle()只是x ^ 2 + y ^ 2 = r ^ 2

public static boolean isOnCircle(int testx, int testy, int x, int y, int r){
    int xx = (testx-x);
    int yy = (testy-y);
    return xx*xx + yy*yy == r*r;
}

但问题在于,并非所有点都位于整数坐标上,因此很多人都不会被绘制出来:

enter image description here

所以最后,我怎么能自信地测试像素是否在圆圈上?

1 个答案:

答案 0 :(得分:0)

您可以检查此像素与下一个像素之间的任何点是否等于半径,方法是检查一个像素是否更小而另一个更大。所以类似:(未经测试)

return (xx*xx + yy*yy <= r*r) ==
       ((xx+1)*(xx+1) + (yy+1)*(yy+1) > r*r);

(a <= b) == (c > d)相当于
((a <= b) && (c > d)) || ((a > b) && (c <= d)),希望有道理。

您也可以尝试使用xx+1, yyxx, yy+1代替xx+1, yy+1 - 如果需要,可以产生更少的像素。


或者,您可以生成圆圈中的像素,而不是检查像素是否位于圆圈中。

这可以通过循环x的可能值来完成,然后解决(x-x0)² + (y-y0)² = r²以确定y(这可以完成,因为你有x,{{1 },x0(圆心)和y0(半径))。然后可以简单地将r值四舍五入为最接近的整数。