2010-06-02 24 views
5

這裏我們有一個涉及顏色的有趣的真實世界算法要求。穩定的隨機顏色算法

  1. N漂亮的顏色:爲了繪製美圖(即:餅圖),我們需要選擇一個隨機組N顏色是「足夠不同的」好看在一起。這可以通過固定亮度和飽和度並逐步通過色調以360/N的步驟完成。
  2. 穩定的顏色分配:給出扇區標記爲('A','B','C')和扇區標記爲('B','C','D')的扇區Pie_1,這將是很好的如果扇區B和C的顏色在Pie_1和Pie_2上都相同。如果隨着時間的推移刪除或添加到圖表中,這將有助於防止混淆。標籤是唯一穩定的東西。
  3. 允許硬編碼顏色:該算法應該允許硬編碼的標籤 - >顏色關係作爲輸入,但會計算其餘標籤的顏色(根據規則1和2)。

我覺得這個算法,即使它看起來很臨時,在多種情況下都會很有用。

任何想法?

更新: 埃裏克是正確的,不可能保證每個標籤的顏色穩定性,因爲新標籤出現和消失。但如果它「足夠穩定」,即顏色變化最小化,我很高興。

我想的是一樣的東西:

  1. 每個標籤使用哈希得到一個隨機色彩值(標籤)%360
  2. 爲了保證生成的色調有足夠的不同,我們把色相以固定數量的步驟循環(即:2*N),並嘗試將之前的色調值「四捨五入」爲新的差異化值。
  3. 在不同標籤達到相同圓角色調值的情況下,我們會以某種方式破壞領帶並將點移動到其他位置。

但是這留下了硬編碼顏色的問題。

回答

4

您可以使用color wheel算法選擇一組隨機顏色,看起來很好。這裏有一個related SO question與實施指南,或谷歌許多其他人。

您可以使用類似標籤的哈希值作爲色輪上的起點以確保穩定性。這也滿足3.如果你有一個覆蓋機制來聲明特定的標籤散列值應該對應於色輪上的特定起始點。

編輯:

色輪讓你選擇一個主起點(例如(散列(A)與A一起使用時,%360),並確保其它兩種顏色(B,C)是「好」 B和C由A確定。如果稍後可以有餅圖(B,Y,Z),則B將被設置爲(散列(B)%360)並且將不同於(A, B,C)的情況。

如果你可以任意混合餅圖上的標籤,NO算法可以確保它們總是看起來很好。這裏有一個簡單的證明:

讓A,B,C被選中,以便它們在一起看起來不錯。

現在,讓我們一出現與任意顏色ž

你當然可以選擇一些顏色對於z使得A和Z的比賽。

您只能保證某一套顏色在一起看起來不錯,而選擇相同的顏色將會重現相同的顏色。

您可以使用例如第一個標籤作爲輪子上的起點(散列(A)),或者您可以組合散列(散列(A)+ 31 *散列(B)+ 31 * 31 *散列(C))。乘以31(一個素數)是來自Java世界的東西,它有助於在組合多個哈希時確保更好的數學分佈。

+0

如果我們定義顏色(標籤):= hsb(散列(標籤)%360,S,B)將起作用,但如何保證色相不同enougt。 另一方面,如果你使用色輪,什麼標籤是散列的,啓動色輪,標籤只是追隨者? 感謝您的回答 – Olmo 2010-06-02 06:44:19

+0

@Olmo:看我的編輯。 – 2010-06-02 15:51:05

+0

很多埃裏克。我已經將問題更改爲社區wiki,因此我可以用更多的空間來回答 – Olmo 2010-06-02 19:03:20