你試圖完成的任務對於循環來說太困難和麻煩。
基本上,你正在嘗試以256^3 = 16,777,216
爲基數。列高爲1080,組合的數量爲天文數字!
(256^3)^1080 ≈ 4.983 × 10^7802
讓我來解釋一個簡單的例子。我們假設它的高度爲4,而不是列高爲1080,而不是每個像素有16,777,216種不同的顏色組合,例如我們只有10種不同的顏色組合。
此外,代替由RGB組成的顏色值,假設每種顏色都可以具有0-9的值。在這個例子中,(4個像素的)列可以處於不同的狀態。
讓我們想像一下:考慮一下柱子是在它的側面,所以它是水平的,讓我們把它看成是那些可以從0-9旋轉的撥號組合鎖之一。
這將是初始狀態(所有4個錶盤/在彩色像素= 0):
-------------------------
| 0 | 0 | 0 | 0 |
-------------------------
這將是最終狀態(所有4個錶盤/在彩色像素= 9):
-------------------------
| 9 | 9 | 9 | 9 |
-------------------------
在你的情況,你就必須有1080個撥號密碼鎖,並且每個轉盤可以從0-16,777,215
現在打滑,我很感興趣,我怎麼能簡化代碼,這樣你就不必哈一般情況下,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;
}
}
}
注意:這種算法從左至右增加值。我認爲這是有道理的,以適應圖形中列的實際問題,因爲你會開始從上到下改變顏色。如果你想讓顏色從底部開始改變,那麼可以通過改變索引,增量減少等來輕鬆地進行調整。
現在,這個例子適用於簡單的整數值和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)
現在的休息代碼幾乎相同,除了我們必須適應幾件事情:
This:
種
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 X 256^3。我們假設在這個例子中,圖形高度爲1080像素,但它可以是任何數字。 – Guitarax
在任何給定的時間點,你想要所有的1080像素是不同的或可以重複一些顏色?我知道你說過你不想讓它們具有相同的顏色(即1條黑色或白色),但540像素爲@(255,255,255)而另一個540 @(0,0,0) 。這裏你的重複顏色容差是多少? –