2009-07-22 20 views
24

मैं एक एल्गोरिदम की तलाश में हूं जो रंगों की एक श्रृंखला उत्पन्न करेगा ताकि रंग जितना संभव हो सके व्यापक रूप से वितरित किए जाएंगे (इसलिए उन्हें आसानी से मिश्रित नहीं किया जाएगा)।अद्वितीय रंग उत्पन्न करने के लिए एल्गोरिदम

मेरे पास ऐसी ऑब्जेक्ट्स हैं जिनमें आईडी 1 से गिनती हैं। मैं इनमें से प्रत्येक को एक अलग, सौंदर्यपूर्ण रूप से सुखदायक रंग के साथ प्रस्तुत करना चाहता हूं जो आसानी से अपने पड़ोसियों के साथ भ्रमित नहीं होगा। हालांकि रंग यादृच्छिक नहीं होना चाहिए। जब भी मैं एक ही आईडी इनपुट करता हूं, मैं एक ही रंग प्राप्त करना चाहता हूं।

उत्तर

6

क्या संभावित तत्वों की संख्या उचित कम है? एक त्वरित और आसान समाधान आइटम की आईडी का उपयोग करके रंग मानों की एक सरणी को स्टोर करना है। यह मानता है कि आपके पास अपेक्षाकृत कम मात्रा में रंग हैं, और आप निश्चित हैं कि आप कुछ निश्चित वस्तुओं से ऊपर नहीं जाएंगे।

यदि आप किसी सूची का उपयोग करने के बजाय रंग उत्पन्न करना चाहते हैं, तो उन्हें एक सतत और सभ्य रूप से देखने के लिए एक चाल है जो उन्हें एचएसबी का उपयोग करके उत्पन्न करना है। एक चमक और संतृप्ति को पूर्व परिभाषित करें, फिर आईडी के कुछ फ़ंक्शन से रंग मूल्य को आधार दें (यह विभिन्न प्रकार की चीजें हो सकती है कि आप कितने आईडी की योजना बना रहे हैं, लेकिन कुछ राशि से आईडी गुणा करना (और जब यह अधिक हो जाता है तो मॉडलिंग 255!) एक अच्छा मोटा दृष्टिकोण है। इस दृष्टिकोण के साथ रंग संतृप्ति और चमक के मामले में सभी "संरेखित" होंगे, लेकिन उनमें से प्रत्येक का एक अलग रंग होगा।

मैं काम पर थोड़ा ऊब गया हूं, इसलिए मैं एक साथ मार पड़ी है एक तेजी से समाधान:।

class HsbColor 
{ 
    public int Hue { get; set; } 
    public int Saturation { get; set; } 
    public int Brightness { get; set; } 

    public Color ToRGB 
    { 
     // left as exercise to the reader... 
    } 
} 

public class Item 
{ 


    public int Id { get; set; } 
    private static const byte EXPECTED_MAX = 15; 
    private static int HUE_FACTOR = 255/EXPECTED_MAX; 

    public HsbColor Color 
    { 
     get { 

     var color = new HsbColor() { Saturation = 175, Brightness = 175 }; 

     color.Hue = (Id * HUE_FACTOR) % 255; 

     return color; 
     } 
    } 
} 
+0

एक तरह से EXPECTED_MAX की भविष्यवाणी से बचने के लिए और अभी भी पाने के लिए एक और भी वितरण के लिए मेरा उत्तर देखें। –

16

आप golden ratio (PHI) द्वारा आईडी गुणा कर सकते हैं पाने के लिए एक नंबर 0 < = n < 1. जो नंबर आप समान रूप से वितरित हो जाते हैं जाएगा उत्पन्न की सभी

PHI = (1 + sqrt(5))/2 
n = id * PHI - floor(id * PHI) 

फिर यह उस संख्या को रंग में परिवर्तित करने की बात है, उदा।

hue = floor(n * 256) 
+7

http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/ –

10

ग्राफिक डिजाइनर पता है कि रंग का एक बहुत एक जानकारी के प्रदर्शन में एक दूसरे के पास इस्तेमाल किया जा करने के लिए जा रहे हैं, रंग अपेक्षाकृत रंग अंतरिक्ष में एक दूसरे के करीब होना चाहिए। संतृप्ति या रंग में छोटे बदलाव आमतौर पर बड़े कूदों से बेहतर होते हैं – जब कई रंग शामिल होते हैं, तो मानव आंख वास्तव में इसे आसान प्राप्त करती है जब रंग दूरी बहुत अच्छी नहीं होती है।

इसके अलावा, यह न भूलें कि आपके कुछ उपयोगकर्ता रंगहीन होंगे। चूंकि रंगहीनता की इतनी सारी किस्में हैं, इसलिए यह जानना मुश्किल है कि संयोजन से बचने के लिए क्या संयोजन है। शायद कोई और इस सवाल को संबोधित कर सकता है?

10

मैं इस एक ही विषय के बारे में एक लेख लिखा है:

How to Generate Random Colors Programmatically

मूल रूप से आप एचएसवी रंग स्थान का उपयोग कर सकते हैं, एक निश्चित संतृप्ति और मूल्य निर्धारित करते हैं, और ह्यू को संशोधित। जब आपको अपनी आवश्यक रंगों की संख्या पता है, तो इस ह्यू की श्रेणी [0,1[ को विभाजित करें। यदि आप आवश्यक रंगों की संख्या नहीं जानते हैं, तो भी आप इस स्थान से रंग चुनने के लिए सुनहरा अनुपात का उपयोग कर सकते हैं।

+2

मैंने जावास्क्रिप्ट का उपयोग करके अपना एल्गोरिदम लागू किया: http://jsfiddle.net/hCtc3/2/ –

+1

@philmccull मैंने इसे केवल 30 अद्वितीय और दृश्यमान रूप से विभिन्न रंगों को केवल रंग बदलने के द्वारा संशोधित करने के लिए संशोधित किया। http://jsfiddle.net/hCtc3/42 – Berty

+1

अच्छी तकनीक। – Timmmm

16

मैंने कुछ तरीकों से अधिक हल करने के लिए इसे करने के सभी तरीकों की जांच की है। और आखिरकार सीआईईडी 2000 के साथ बलपूर्वक बलपूर्वक और वास्तव में, आपकी सबसे अच्छी शर्त सिर्फ एक स्थिर सूची है। आप अच्छी तरह से 30 से अधिक रंग नहीं प्राप्त कर सकते हैं इससे कोई फर्क नहीं पड़ता कि आप क्या करते हैं। रंग अंधापन और भ्रम की रेखाओं में कारक, और आप वास्तव में कुछ ऐसा कर रहे हैं जो बाधा है।एक लुकअप टेबल का उपयोग करें और डेटा रंगों को रंग की तुलना में कुछ अन्य विशेषताओं के साथ संशोधित करें।

max difference color palette

#000000 
#00FF00 
#0000FF 
#FF0000 
#01FFFE 
#FFA6FE 
#FFDB66 
#006401 
#010067 
#95003A 
#007DB5 
#FF00F6 
#FFEEE8 
#774D00 
#90FB92 
#0076FF 
#D5FF00 
#FF937E 
#6A826C 
#FF029D 
#FE8900 
#7A4782 
#7E2DD2 
#85A900 
#FF0056 
#A42400 
#00AE7E 
#683D3B 
#BDC6FF 
#263400 
#BDD393 
#00B917 
#9E008E 
#001544 
#C28C9F 
#FF74A3 
#01D0FF 
#004754 
#E56FFE 
#788231 
#0E4CA1 
#91D0CB 
#BE9970 
#968AE8 
#BB8800 
#43002C 
#DEFF74 
#00FFC6 
#FFE502 
#620E00 
#008F9C 
#98FF52 
#7544B1 
#B500FF 
#00FF78 
#FF6E41 
#005F39 
#6B6882 
#5FAD4E 
#A75740 
#A5FFD2 
#FFB167 
#009BFF 
#E85EBE 
संबंधित मुद्दे

 संबंधित मुद्दे