Java for循环,同时将变量保持在一个范围内
我试着运行一个双for循环,循环遍历像彩色大正方形(例如300x300)这样的东西,并用一个小正方形(比如100x100)的颜色(或像素)替换它,这就是k和l所代表的 基本上,我想知道如何保持k和l在0-100之间运行,并在达到100后重新启动,但同时保持I和j始终运行。我尝试使用了4个嵌套for循环,但它没有正常工作,虽然我开始认为这可能是一个解决方案,但这将是非常低效的 请让我知道,如果这听起来有点困惑,我会尽力解释得更清楚,谢谢 请原谅我的假代码Java for循环,同时将变量保持在一个范围内,java,loops,for-loop,nested,iteration,Java,Loops,For Loop,Nested,Iteration,我试着运行一个双for循环,循环遍历像彩色大正方形(例如300x300)这样的东西,并用一个小正方形(比如100x100)的颜色(或像素)替换它,这就是k和l所代表的 基本上,我想知道如何保持k和l在0-100之间运行,并在达到100后重新启动,但同时保持I和j始终运行。我尝试使用了4个嵌套for循环,但它没有正常工作,虽然我开始认为这可能是一个解决方案,但这将是非常低效的 请让我知道,如果这听起来有点困惑,我会尽力解释得更清楚,谢谢 请原谅我的假代码 for (i=0; i < widt
for (i=0; i < width; i++)
for (j=0; i< height; j++)
set(i, j , pixel(k,l));
(i=0;i
对于(j=0;i
可以通过以下方式完成:
for (i = 0; i < width; i++) {
for (j = 0; j < height; j++) {
if(k > 100) {
k = 0;
}
if(l > 100) {
l = 0;
}
k++;
l++;
set(i, j , pixel(k,l));
}
}
(i=0;i{
对于(j=0;j100){
k=0;
}
如果(l>100){
l=0;
}
k++;
l++;
设置(i,j,像素(k,l));
}
}
问题似乎是将一个图像平铺到另一个图像上。目标图像的尺寸有width
和height
,因此假设sourceWidth
和sourceHeight
是源图像的尺寸(在您的示例中为100 x 100)
要平铺图像,需要k==i%sourceWidth
和l==j%sourceHeight
,以便从源图像读取的像素“环绕”边界。这些应该是。满足这些条件的最简单方法是直接声明它们:
for(int i=0;i
这会执行大量%
操作,这可能会非常低效,但它为我们提供了一段正确的代码进行转换。如果我们递增k
和l
,则需要两个属性来维护不变量:
k
和i
同时递增;和l
和j
同时递增k
达到sourceWidth
时,它必须返回到0,对于l
和sourceHeight
也是如此for(int i=0,k=0;i
注意,循环初始化器和步进器的现在为两个循环声明并更新两个变量。这在Java中是允许的
这可能比执行许多%
操作要快,但请注意,使用if
语句进行分支,因此您可能需要对其进行基准测试以确保其正确性
在源图像的维数为2的幂的特殊情况下,我们可以通过快速逐位运算获得相同的结果:i%sourceWidth
将等效于i&(sourceWidth-1)
:
//特殊情况:sourceWidth和sourceHeight是2的幂
int wMask=sourceWidth-1,hMask=sourceHeight-1;
对于(int i=0,k=0;i
您在这里实际要解决的问题是什么;您是将图像平铺到更大的图像上,还是通过最近邻采样调整大小?@kaya3将图像平铺到更大的图像上,因此在本例中,基本上每个较小的图像都是100x100,因此对于300x300,它将是3个图像,3个图像向下。我没有提到“l”必须循环到100,而k=0,k=1也是如此,类似于嵌套for循环,这也是我尝试过的,但无法正常工作。谢谢!我试图实现一些类似于您编写的第二个代码的东西,但它没有正常工作,但在阅读您的回复后,我能够理解它,非常感谢。