gpt4 book ai didi

Java for 循环,同时将变量保持在一个范围内

转载 作者:行者123 更新时间:2023-12-01 19:57:52 25 4
gpt4 key购买 nike

我尝试运行两个 for 循环,迭代诸如彩色大正方形(例如 300x300)之类的东西,并将其替换为较小正方形(例如 100x100)的颜色(或像素),这就是 k 和 l 所代表的。

本质上,我想知道如何保持 k 和 l 在 0-100 之间运行,并在达到 100 后重新启动,同时又保持 i 和 j 始终运行。我尝试使用 4 个嵌套 for 循环,但它无法正常工作,尽管我开始认为这可能是一个解决方案,但效率非常低。

如果这听起来有点令人困惑,请告诉我,我会尽力解释得更清楚,谢谢。

请原谅伪代码

for (i=0; i < width; i++)
for (j=0; i< height; j++)
set(i, j , pixel(k,l));

最佳答案

问题似乎是将一个图像平铺到另一个图像上。您有目标图像尺寸的 widthheight,因此假设 sourceWidthsourceHeight 是源图像的尺寸(在您的示例中为 100 x 100)。

要平铺图像,您需要 k == i % sourceWidthl == j % sourceHeight,以便从源图像读取的像素“包裹”围绕”的边界。这些应该是invariant conditions 。满足它们的最简单方法是直接这样声明它们:

for(int i = 0; i < width; ++i) {
int k = i % sourceWidth;
for(int j = 0; j < height; ++j) {
int l = j % sourceHeight;
set(i, j, pixel(k, l));
}
}

这会执行大量 % 操作,效率可能相当低,但它为我们提供了一段正确的代码进行转换。如果我们递增 kl,则需要两个属性来维持不变量:

  1. ki 一致递增; lj 一致递增。
  2. k达到sourceWidth时,它必须回绕到0,对于lsourceHeight也是如此。<
for(int i = 0, k = 0; i < width; ++i, ++k) {
if(k == sourceWidth) { k = 0; }
for(int j = 0, l = 0; j < height; ++j, ++l) {
if(l == sourceHeight) { l = 0; }
set(i, j, pixel(k, l));
}
}

请注意,for 循环初始化器和步进器现在为两个循环声明和更新两个变量。 Java 中允许这样做。

这可能比执行大量 % 操作更快,但请注意使用 if 语句进行分支 can also slow down an algorithm ,因此您可能需要对其进行基准测试以确保确定。

在源图像的尺寸为 2 的幂的特殊情况下,我们可以通过快速按位运算获得相同的结果:i % sourceWidth 将相当于 i & (sourceWidth - 1):

// special case: sourceWidth and sourceHeight are powers of 2
int wMask = sourceWidth - 1, hMask = sourceHeight - 1;
for(int i = 0, k = 0; i < width; ++i, ++k) {
for(int j = 0, l = 0; j < height; ++j, ++l) {
set(i, j, pixel(i & wMask, j & hMask));
}
}

关于Java for 循环,同时将变量保持在一个范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59024969/

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