2016-06-24 49 views
2

我正在嘗試在垂直像素集上滾動每個可能的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

假設圖形的高度不是256^3像素高,您如何使用所有可能的組合?或者你想在給定的列中設置不同的顏色集合嗎?不清楚你在問什麼。 –

+0

256立方是所有可能的顏色1像素。我需要做的是將所有顏色應用於每個可能組合中垂直列中的每個像素。結果是1080 X 256^3。我們假設在這個例子中,圖形高度爲1080像素,但它可以是任何數字。 – Guitarax

+0

在任何給定的時間點,你想要所有的1080像素是不同的或可以重複一些顏色?我知道你說過你不想讓它們具有相同的顏色(即1條黑色或白色),但540像素爲@(255,255,255)而另一個540 @(0,0,0) 。這裏你的重複顏色容差是多少? –

回答

1

你試圖完成的任務對於循環來說太困難和麻煩。

基本上,你正在嘗試以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; 
} 

我希望這可以幫助。祝你好運!

+0

這似乎正是我正在尋找的。我認爲for循環模型會不夠,但我不知道替代方案。非常感謝你。 – Guitarax

+0

不客氣。很高興我能夠提供幫助。 –