2009-02-26 113 views
1

也許我喝了太多咖啡,可能我工作太久了,無論我對這種方法的作用感到不知所措,或者更確切地說,它爲什麼以及如何做,都沒有人可以點亮在我身上?什麼是下一個顏色?這種神祕的色彩方法是做什麼的?它返回什麼?

public Color nextColor() { 
    int max = 0, min = 1000000000, cr = 0, cg = 0, cb = 0; 
    for (int r = 0; r < 256; r += 4) { 
     for (int g = 0; g < 256; g += 4) { 
     for (int b = 0; b < 256; b += 4) { 
      if (r + g + b < 256 || r + g + b > 512) { 
       continue; 
      } 
      min = 1000000000; 
      for (Color c : colorTable) { 
       int dred = r - c.getRed(); 
       int dgreen = g - c.getGreen(); 
       int dblue = b - c.getBlue(); 
       int dif = dred * dred + dgreen * dgreen + dblue * dblue; 
       if (min > dif) { 
        min = dif; 
       } 
      } 
      if (max < min) { 
       max = min; 
       cr = r; 
       cg = g; 
       cb = b; 
      } 
     } 
     } 
    } 

    return new Color(cr, cg, cb, 0x90); 
} 

UPDATE

感謝您的答覆大家。在程序中查看方法的上下文很明顯,他們的意圖確實是返回距離現有顏色集「最遠」的新顏色。

感謝Sparr對這個問題提出followup,我肯定會在你的建議的基礎上重寫上述內容。

我不是很瞭解RGB色階。瞭解上述方法的意圖是檢索「贈品?」顏色到現有顏色組合,在我們如何看待顏色的意義上,1中提供的解決方案實際上是否可以互補?是否有一種更簡單的方法來選擇與該組合相匹配的顏色,還是RGB組件的數值分析實際上會產生合適的顏色?

+0

哇!喜歡,顏色! – 2009-02-26 04:50:00

+1

你可能要發送這一個到TheDailyWTF.com – Uri 2009-02-26 04:53:18

回答

0

考慮由colorTable中的點定義的僞立體在其內部具有大的「空心」,使得nextColor將該空心的中心點選爲nextColor的情況。根據你對colorTable的瞭解,這種情況可能非常罕見。如果預測結果非常稀少,並且在這些情況下您願意接受一個不太理想的(假設我們將下一個色彩的輸出作爲最佳)解決方案,那麼就會出現一個明顯的優化。

在除上述之外的所有情況下,nextColor選擇的顏色將位於最小凸包的表面某處,幷包圍由您的循環定義的1/64密度色彩空間中的所有點。生成該表面上的點列表比生成所有點列表的簡單循環在計算上稍微複雜一些,但它會將搜索空間縮小約25倍。

在絕大多數情況下,簡化搜索的結果將成爲該凸包的一個角上的一個點。考慮到只有那些將你的搜索空間減少到一個簡單的列表(24個候選人,如果我的心理幾何對我很好),可以提前存儲。

如果從這些顏色中選擇的下一個顏色與您的colorTable「太接近」,那麼您可以重新運行原始類型的搜索,以期找到上述的「空洞」類型。搜索的密度可以根據第一次傳球的距離有多近,並從那裏縮小。也就是說,如果超快速搜索在colorTable中發現距離其最近鄰居8個單元的nextColor,則要比在顏色表內至少要找到至少16個單元的中空更好。運行8步的原始搜索並存儲距離超過4個單位的任何候選項(空洞不可能與搜索網格對齊),然後在每個候選項上居中進行半徑爲12的更高密度搜索。

在我看來,您的搜索空間的1/64密度本質(所有倍數爲4)可能是由原始作者爲了加速搜索的目的而設立的。鑑於這些改進,您可以放棄這種妥協。

所有這一切都假定您想要堅持改進這種尋找對比色的天真方法。當然,有更好的方法,給定相同或更多(colorTable中的哪些顏色是您使用中最普遍的顏色?哪些顏色與人眼對比度更高)信息。

3

看起來像你有colortable這是一個存儲顏色列表。

然後你的有分量

顏色的是 4的倍數,並「沒有太多亮點」 而不是「太黑不是」這個奇怪的硬編碼色彩空間。

這個功能似乎給了你後者中的顏色,它與你的顏色表「最佳對比」。

當我說對比時,這是通過使用2-範數選擇儘可能遠離顏色表的顏色來定義的。

1

給定的顏色對象的全局陣列命名colorTable,此功能會發現從下面的顏色空間中最接近*每一個數組中,然後這是最遠的那些顏色的一個顏色:

紅,綠,藍分量的256和512

之間4 紅+綠+藍的多個*:「最接近」被定義爲對於每個顏色分量差值的平方的總和最小。

正如保羅決定,這似乎是一個合理的,如果瘋狂的低效執行,幼稚的方法尋找一個單一的顏色,提供colorTable內容的高對比度。同樣的結果可以通過colorTable單次傳遞和更多的數學運算找到,而不是通過colorTable傳遞大約500萬次,並且有更好的方法來找到提供更高平均對比度的不同顏色。

0

它試圖讓你得到另一種顏色

a)僞彩色編碼數據集。 b)在圖上畫另一條線。

相關問題