То, что вы пытаетесь выполнить, слишком сложно и громоздко для петель.
В принципе, вы пытаетесь подсчитать в базе 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
Теперь, я был заинтересован в том, как я могу упростить код так, что у вас нет га ve 1080 для циклов или n для циклов в общем случае, где 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;
}
}
}
Примечание: Этот алгоритм увеличивает значения слева направо. Я понял, что это имело смысл приспособить его к реальной проблеме с колонкой в графике, так как вы начнете менять цвета сверху вниз и снизу вверх. Если вы хотите, чтобы цвета начали меняться снизу вверх, тогда его можно легко адаптировать, изменив индексы, приращения до декрементов и т. Д.
Теперь этот пример предназначен для простых целых значений и внутренних массивов. Как мы можем адаптировать его к вашей проблеме с цветами?
Во-первых, давайте предположим, что срез столбец представляет собой массив 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;
}
Кроме того, имейте в виду, что вам нужно будет инициализировать массив цвета. Это можно сделать так:
for (int i = 0; i < arr.length; i++)
{
arr[i] = Color.BLACK;
}
Надеюсь, это поможет. Удачи!
Как вы можете использовать все возможные комбинации, если высота графика не равна 256^3 пикселям? Или Вы хотите различный набор цветов в данном столбце? Непонятно, что вы просите. –
256 кубов - все возможные цвета для 1 пикселя. Мне нужно сделать все цвета для каждого пикселя в вертикальном столбце в каждой возможной комбинации. Это составляет 1080 х 256^3. В этом примере мы предполагаем, что графический дисплей имеет высоту 1080 пикселей, но это действительно может быть любое число. – Guitarax
В любой момент времени вы хотите, чтобы все 1080 пикселей были четкими или могли повторяться некоторые цвета? Я знаю, что вы сказали, что не хотите, чтобы они имели одинаковый цвет (например, 1 полоса черного или белого), но как насчет случая, когда 540 пикселей были бы @ (255,255,255), а остальные 540 @ (0,0,0) , Какова ваша повторяющаяся цветовая толерантность? –