gpt4 book ai didi

Java - 遍历以 x、y 和半径为中心的 2D 圆中的所有像素?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:36:00 25 4
gpt4 key购买 nike

我有一个要循环的 BufferedImage。我想循环遍历半径为 radius 的圆内的所有像素,该圆的中心 x 和 y 位于 xy

我不想以方形方式循环它。 如果我能做到这一点并减少流程中的复杂性,那也很好,但这不是必需的。因为圆的面积是 pi * r^2 而正方形是 4 * r^2 这意味着我可以得到 4/pi如果我在一个完美的圆圈中循环,则 O 复杂度会更好。 如果在 x,y 处的半径为 radius 的圆会发生大于 BufferedImage 的尺寸,然后防止越界(这可以通过 if 语句来完成,我相信可以防止每次检查时越界)。

示例:O 表示已记录像素,而 X 表示未循环。

半径 1

X   O   X
O O O
X O X

半径 2

X   X   O   X   X
X O O O X
O O O O O
X O O O X
X X O X X

我认为正确的方法是使用三角函数,但我不太明白。我知道一个简单的部分是添加从原点开始 radius 中向上、向左、向右和向下的所有像素。想要一些建议,以防有人有任何建议。

private LinkedList<Integer> getPixelColorsInCircle(final int x, final int y, final int radius)
{
final BufferedImage img; // Obtained somewhere else in the program via function call.
final LinkedList<Integer> ll = new Linkedlist<>();

for (...)
for (...)
{
int x = ...;
int y = ...;

ll.add(img.getRGB(x, y)); // Add the pixel
}
}

最佳答案

圆心 O(x,y) 和半径 r 以下坐标 (j,i) 将覆盖圆圈。

for (int i = y-r; i < y+r; i++) {
for (int j = x; (j-x)^2 + (i-y)^2 <= r^2; j--) {
//in the circle
}
for (int j = x+1; (j-x)*(j-x) + (i-y)*(i-y) <= r*r; j++) {
//in the circle
}
}

方法说明:

  1. 通过圆心的直线从上到下垂直。
  2. 水平移动直到你到达圆圈外的坐标,所以你只击中每行圆圈外的两个像素。
  3. 移动到最低行。

因为它只是一个近似的圆,所以对于小的 rs 来说它可能看起来像一个正方形

啊,就 Big-O 而言,减少 4 倍的操作并不会改变复杂性。

Big-O =/= 复杂度

关于Java - 遍历以 x、y 和半径为中心的 2D 圆中的所有像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40779343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com