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

问题描述 投票:0回答:2

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

我尝试过绕圈:

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

那么最后,我如何才能自信地测试像素是否在圆上?

algorithm drawing geometry
2个回答
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, yy
xx, yy+1
代替
xx+1, yy+1
- 如果需要的话,这应该会产生更少的像素。


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

这可以通过循环遍历

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


0
投票

在这里您可能会找到

O(x-y)
时间复杂度算法的良好实现,该算法应用@Khaelex建议的中点圆算法

© www.soinside.com 2019 - 2024. All rights reserved.