2014-02-18 62 views
1

我想寫下面的邏輯的方法:在java中瀏覽所有顏色

我有3個整數,r,g和b。

開頭:

r = 255; 
g = 0; 
b = 0; 

現在你可以看到,r是255,現在摹應該上升一個接一個,直到它達到255,也

r = 255; 
g = 255; 
b = 0; 

所有三個整數一起asseble一種顏色。第一個是紅色的,現在是黃色的。不應該變成綠色,以r應適當減少,直到只有g爲255:

r = 0; 
g = 255; 
b = 0; 

下一頁顏色應該是青色,等等。

這是爲了:

red - yellow - green - cyan - blue - violet - red 

- >和開始。

我試着用IF-的方法來實現這一目標:

e.g.: if(r == 255 && g == 0) g++; 

等,但我意識到這將是長期和複雜的。

有沒有人有另一個想法如何循環顏色?

我的目標是改變一個方形物體的顏色每次更新:

public void update() { 
    -->color change code here<-- 
    color = new Color(r, g, b, alpha); 
} 

所以每次更新方法被調用(全5毫秒)時,該代碼被調用。

任何想法?

+1

你想逐漸從一種顏色過渡到下一個,對吧?也許你可以創建一大堆硬編碼的Color對象。它只有1500個元素長,或者如此:-) – Kevin

回答

3

java.awt.Color類提供一個靜態函數

getHSBColor(float h, float s, float b)

使用HSB色空間,使色調分量去從0到1,同時保持其它組分不變。

color = Color.getHSBColor(hue, 1, 1); 
+0

是的,從0浮動到1,但效果很棒!謝謝!! – user2410644

+0

這是絕對正確的,我必須一直在考慮另一個API,其中色相被指定爲度(1 - 360)的值。 – Joni

0
for (int red=0; red<256; red++) 
    for (int green=0; green<256; green++) 
     for (int red=0; red<256; red++) { 
     // output of every combination of all red, green and blue 
     } 

或者,如果你只是想在0和255的值,只是讓他們數到1,再乘以255到另一個變量。

+0

不,他/她想要所有最大飽和的顏色,不是每種可能的顏色,也不是所有的顏色都是0或255的八種顏色。這不符合他/她想要的。 –

1

下面是使用for循環顯示的更改示例,希望這有助於您!

public class rgb { 
    public static void main(String[] args) { 
     // establish your starting conditions 
     int r, g, b; 
     r = 255; 
     g = 0; 
     b = 0; 

     // increment g by 1 until it reaches 255 
     for (int i = 0; i <= 255; i++) { 
      g = i; 
      /* Do whatever you 
      * want with this 
      * color here */ 
     } 

     // de-increment r by 1 until it's 0 
     for (int i = 254; i >= 0; i--) { 
      r = i; 
      /* Do whatever you 
      * want with this 
      * color here */ 
     } 
    } 
} 
3

根據你的週期你有6個轉換,每個轉換256步。每個轉換對所有三個RGB通道都有效,但以一種移位的方式進行。

例如,假設你從255,0,0開始你會碰到這樣的:從這個

R 255 --- \   /--- 
      \   /
    0   \ --- ---/

G 255 /--- --- \ 
    /   \ 
    0 /   \ --- --- 

B 255   /--- --- \ 
      /   \ 
    0 --- ---/   \ 

    R Y G C B M R.. 

,你可以很容易地看到,整個週期爲6片×256層的步驟。在每個片段中,每個通道可以穩定,上升或下降。同時你可以看到綠色和藍色通道就像剛剛移動的紅色通道一樣。

所以我們只注重紅色通道:

int redValueForStep(int step) { 
    step %= 256*6; // let's make step wrap around 
    int fragment = step/256; // which fragment 0-5 
    int fragmentStep = step%256; // which step inside fragment 0-255 

    switch (fragment) { 
    case 0: case 5: 
     return 255; // first and last fragment have steady high value 
    case 2: case 3: 
     return 0; // fragments 2 and 3 have steady low value 
    case 1: return 255-fragmentStep; // falling 
    case 2: return fragmentStep; // rising 
} 

一旦你有紅色通道,你可以很容易地計算其他的,綠色通道爲紅色的領先整整兩個片段轉移,所以你添加4〜環繞(以避免具有負值):

int greenValueForStep(int step) { return redValueForStep(step+256*4); } 

同樣的事情適用於藍色通道。

+0

哇,謝謝你的回答,聽起來比我的第一個想法使用「如果」更容易...但我更喜歡使用Color.GetHSBColor()。但是,謝謝你的想法! – user2410644

相關問題