gpt4 book ai didi

java - 滚动垂直像素列上的所有颜色组合

转载 作者:行者123 更新时间:2023-11-30 10:42:41 25 4
gpt4 key购买 nike

我试图在一组垂直像素上滚动浏览每一种可能的 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)+";";
}
}
}

现在我需要一些可以将像素颜色应用到列的东西。我只是不确定如何计算出这样做的逻辑,因为我必须在所有可能的组合中应用颜色。所以拥有一条全白的垂直 strip 和一条全黑的垂直 strip 不是我的目标。而是所有可能组合中的零星像素点。

最佳答案

你想要完成的事情对于 for 循环来说太困难和繁琐了。

基本上,您正在尝试以 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 旋转的刻度盘的密码锁之一。

这将是初始状态(颜色 = 0 时所有 4 个刻度盘/像素):

-------------------------
| 0 | 0 | 0 | 0 |
-------------------------

这将是最终状态(颜色 = 9 时所有 4 个刻度盘/像素):

-------------------------
| 9 | 9 | 9 | 9 |
-------------------------

在您的情况下,您将拥有一个具有 1080 个刻度盘的组合锁,每个刻度盘可以从 0-16,777,215 旋转

现在,我感兴趣的是如何简化代码,以便在 n 是列的高度的一般情况下,您不必有 1080 个 for 循环或 n 个 for 循环。

这是我想出的:

// 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;
}

希望对您有所帮助。祝你好运!

关于java - 滚动垂直像素列上的所有颜色组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38017499/

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