我正在尝试在垂直像素集上滚动浏览每一种RGB颜色组合。在此示例中,假设像素列为1080.我知道所有可能的组合在该数量上达到约180亿。我似乎无法绕过循环结构。我有循环来计算一个像素的所有颜色组合。
for(int r = 0;r < 256;r++){
for(int g = 0;g < 256;g++){
for(int b = 0;b < 256;b++){
pixelC =
Integer.toString(r)+":"+
Integer.toString(g)+":"+
Integer.toString(b)+";";
}
}
}
现在我需要能够将像素颜色应用于列的东西。我只是不确定如何计算出这样做的逻辑,因为我必须在所有可能的组合中应用颜色。因此,所有白色的垂直条带都是全黑的垂直条带不是我的目标。而是在所有可能的组合中零星地加像素。
答案 0 :(得分:1)
你想要完成的任务对于循环来说太困难和麻烦。
基本上,您正试图计算基数256^3 = 16,777,216
。如果列高为1080,则组合数量天文!
(256^3)^1080 ≈ 4.983 × 10^7802
让我用一个简化的例子来解释。而不是列高为1080,让我们说它的高度为4.而不是每个像素有16,777,216种不同的颜色组合,比如我们只有10种不同的颜色组合。
此外,不是颜色值由RGB组成,而是说每种颜色的值可以是0-9。在此示例中,列(4个像素)可以处于10^4 = 10,000
个不同的状态。
让我们想象一下:想想柱子在它的一侧,所以它是水平的,让我们把它当成它的一个组合锁,其表盘可以从0旋转9。
这将是初始状态(所有4个刻度/颜色= 0的像素):
-------------------------
| 0 | 0 | 0 | 0 |
-------------------------
这将是最终状态(所有4个刻度/颜色= 9的像素):
-------------------------
| 9 | 9 | 9 | 9 |
-------------------------
在您的情况下,您将拥有一个具有1080个拨号的密码锁,每个拨号盘可以从0-16,777,215旋转
现在,我对如何简化代码感兴趣,以便在一般情况下你不必拥有1080 for循环或n for循环,其中n是列的高度。
这是我想出的:
// This represents the combination lock with 4 dials
int [] arr = new int [4];
// This represents how many states each dial can be in
int base = 10; // (0-9)
boolean done = false;
while (!done)
{
// just for printing out the current state of the array
System.out.println(Arrays.toString(arr));
int index = 0;
// get to the first dial that has not reached its max value
while (index < arr.length && arr[index] == base - 1)
{
index++;
}
// all dials are at the max value -> we are done
if (index == arr.length)
{
done = true;
}
else
{
// increase the first dial we found to not have a max value
arr[index]++;
// set all dials before it to 0
for (int i = 0; i < index; i++)
{
arr[i] = 0;
}
}
}
注意:此算法从左到右增加值。我认为通过图形中的列来适应实际问题是有意义的,因为您将开始从上到下自上而下改变颜色。如果你想让颜色从下往上开始变化,那么可以通过改变指数,增量到减量等来轻松调整颜色。
现在,此示例适用于简单整数值和int数组。我们如何使用颜色来适应您的问题?
首先,让我们假设列切片是java.awt.Color
即int [] arr = new int [4];
成为Color [] arr = new Color [4];
接下来,我们将int base = 10; // (0-9)
int base = 16777216; // (0-16,777,215)
现在,除了我们必须适应一些事情之外,其余代码几乎相同:
此:
while (index < arr.length && arr[index] == base - 1)
{
index++;
}
需要成为这个:
while (index < arr.length && arr[index].equals(Color.WHITE))
{
index++;
}
此:
// increase the first dial we found to not have a max value
arr[index]++;
需要成为这个:
// increase the first color we found to not have a max value
Color current = arr[index];
arr[index] = new Color(current.getRGB() + 1);
最后,对于这部分:
// set all dials before it to 0
for (int i = 0; i < index; i++)
{
arr[i] = 0;
}
我们可以做到:
// set all colors before it to 0
for (int i = 0; i < index; i++)
{
arr[i] = Color.BLACK;
}
另外,请记住,您需要初始化Color数组。这可以这样做:
for (int i = 0; i < arr.length; i++)
{
arr[i] = Color.BLACK;
}
我希望这会有所帮助。祝你好运!