我试图通过检查图像上的每个像素是否在形状上来绘制形状。
我已经尝试过制作圈子了:
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;
}
但问题在于,并非所有点都位于整数坐标上,因此很多人都不会被绘制出来:
所以最后,我怎么能自信地测试像素是否在圆圈上?
答案 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, yy
或xx, yy+1
代替xx+1, yy+1
- 如果需要,可以产生更少的像素。
或者,您可以生成圆圈中的像素,而不是检查像素是否位于圆圈中。
这可以通过循环x
的可能值来完成,然后解决(x-x0)² + (y-y0)² = r²
以确定y
(这可以完成,因为你有x
,{{1 },x0
(圆心)和y0
(半径))。然后可以简单地将r
值四舍五入为最接近的整数。