आपके सहयोग के लिए धन्यवाद

रंग पहियों बनाने के लिए समारोह

यह कुछ ऐसा है जो मैंने कई बार छद्म हल किया है और कभी भी समाधान नहीं मिला है। वह मेरे साथ फंस गया है। समस्या N रंग उत्पन्न करने के तरीके के साथ आना है, जो संभवतः यथासंभव भिन्न हैं जहां N एक पैरामीटर है।

0
जोड़ा संपादित
विचारों: 1
आखिर में मैंने JFreeChart को यह सटीक एल्गोरिदम देखा है और यह ओपन सोर्स है क्योंकि आप यह देख सकते हैं कि यह क्या करता है । मुझे पता है कि मुझे लगता है कि रंग कुछ सर्कल या गोलाकार के साथ यादृच्छिक रूप से दूरी नहीं लगते हैं, बल्कि अधिक विशेष रूप से चुना जाता है।
जोड़ा लेखक Kathy Van Stone

8 उत्तर

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

Edit: Thinking about this problem more, it would be better to map the colors in a linear manor, possibly (0,0,0) --> (255,255,255) lexicographically, and then distribute them evenly. I really don't know how well this will work, but it should since, lets say:

एन = 10 हम जानते हैं कि हमारे पास 16777216 रंग हैं (256 ^ 3)। हम लेक्सिकोग्राफिक रूप से अनुक्रमित रंग को खोजने के लिए buckles एल्गोरिदम 515 का उपयोग कर सकते हैं \ frac {\ binom {256 ^ 3} {3}} {n} * i। अतिप्रवाह से बचने के लिए आपको शायद एल्गोरिदम संपादित करना होगा और शायद कुछ मामूली गति सुधार जोड़ें।

0
जोड़ा
मैं सहमत हूं कि तार्किक लगता है। आरजीबी ज्यादातर बैंगनी और नारंगी संकर बनाता है और अपेक्षाकृत दुर्लभ नीले हरे संकर बनाता है ... रंग का स्तर इन्फ्रा लाल से गहरे नीले रंग के समान होता है, इसलिए इसके साथ समान बिंदुओं को चुनना होता है। इंद्रधनुष आधारित अलगो की जरूरत है।
जोड़ा लेखक com.prehensible
कृपया StackExchange रंग सिद्धांत साइट को ऊपर उठाने / अनुसरण करने पर विचार करें: area51.stackexchange.com/proposals/110687/color-theory</ एक>
जोड़ा लेखक Adi Shavit
यह गलत है क्योंकि आरजीबी रंग की जगह अवधारणात्मक रूप से समान नहीं है
जोड़ा लेखक adrienlucca.wordpress.com

मैंने कहीं पढ़ा है मानव आंख 4 से कम मूल्यों के बीच अंतर नहीं कर सकता है। तो यह ध्यान में रखना कुछ है। निम्नलिखित एल्गोरिदम इस के लिए क्षतिपूर्ति नहीं करता है।

मुझे यकीन नहीं है कि यह वही है जो आप चाहते हैं, लेकिन यह यादृच्छिक रूप से गैर-दोहराने वाले रंग मान उत्पन्न करने का एक तरीका है:

(सावधान रहें, असंगत छद्म कोड आगे)

//colors entered as 0-255 [R, G, B]
colors = []; //holds final colors to be used
rand = new Random();

//assumes n is less than 16,777,216
randomGen(int n){
   while (len(colors) < n){
      //generate a random number between 0,255 for each color
      newRed = rand.next(256);
      newGreen = rand.next(256);
      newBlue = rand.next(256);
      temp = [newRed, newGreen, newBlue];
      //only adds new colors to the array
      if temp not in colors {
         colors.append(temp);
      }
   }
}

बेहतर दृश्यता के लिए आप इसे अनुकूलित कर सकते हैं एक तरीका यह है कि प्रत्येक नए रंग और सरणी के सभी रंगों के बीच की दूरी की तुलना करना होगा:

for item in color{
   itemSq = (item[0]^2 + item[1]^2 + item[2]^2])^(.5);
   tempSq = (temp[0]^2 + temp[1]^2 + temp[2]^2])^(.5);
   dist = itemSq - tempSq;
   dist = abs(dist);
}
//NUMBER can be your chosen distance apart.
if dist < NUMBER and temp not in colors {
   colors.append(temp);
}

लेकिन यह दृष्टिकोण आपके एल्गोरिदम को काफी हद तक धीमा कर देगा।

एक और तरीका यादृच्छिकता को स्क्रैप करना और व्यवस्थित रूप से प्रत्येक 4 मानों के माध्यम से जाना होगा और उपर्युक्त उदाहरण में एक सरणी में रंग जोड़ना होगा।

0
जोड़ा

क्या यह एक कारक भी नहीं है जिससे आप रंग स्थापित कर सकें?

जैसे कि आप डिली-ओएस विचार का उपयोग करते हैं, आपको जितना संभव हो सके रंगों को मिश्रण करने की आवश्यकता है। 0 64 128 256 एक से दूसरे तक है। लेकिन एक पहिया में 0 256 64 128 अधिक "अलग" होगा

इसका कोई मतलब भी है क्या?

0
जोड़ा

कुछ संबंधित संसाधन:

ColorBrewer - Sets of colours designed to be maximally distinguishable for use on maps.

Escaping RGBland: Selecting Colors for Statistical Graphics - A technical report describing a set of algorithms for generating good (i.e. maximally distinguishable) colour sets in the hcl colour space.

0
जोड़ा
आरजीबीलैंड से बचने के लिए अवधारणात्मक रूप से अलग-अलग रंग पट्टियों को चुनने के लिए संदर्भ पढ़ना आवश्यक है।
जोड़ा लेखक Drake Guan

यहां निर्दिष्ट कोड के एचएसएल कलर व्हील के आसपास समान रूप से आरजीबी रंग आवंटित करने के लिए कुछ कोड दिया गया है।

class cColorPicker
{
public:
    void Pick( vector&v_picked_cols, int count, int bright = 50 );
private:
    DWORD HSL2RGB( int h, int s, int v );
    unsigned char ToRGB1(float rm1, float rm2, float rh);
};
/**

  Evenly allocate RGB colors around HSL color wheel

  @param[out] v_picked_cols  a vector of colors in RGB format
  @param[in]  count   number of colors required
  @param[in]  bright  0 is all black, 100 is all white, defaults to 50

  based on Fig 3 of http://epub.wu-wien.ac.at/dyn/virlib/wp/eng/mediate/epub-wu-01_c87.pdf?ID=epub-wu-01_c87

*/

void cColorPicker::Pick( vector&v_picked_cols, int count, int bright )
{
    v_picked_cols.clear();
    for( int k_hue = 0; k_hue < 360; k_hue += 360/count )
        v_picked_cols.push_back( HSL2RGB( k_hue, 100, bright ) );
}
/**

  Convert HSL to RGB

  based on http://www.codeguru.com/code/legacy/gdi/colorapp_src.zip

*/

DWORD cColorPicker::HSL2RGB( int h, int s, int l )
{
    DWORD ret = 0;
    unsigned char r,g,b;

    float saturation = s / 100.0f;
    float luminance = l / 100.f;
    float hue = (float)h;

    if (saturation == 0.0) 
    {
      r = g = b = unsigned char(luminance * 255.0);
    }
    else
    {
      float rm1, rm2;

      if (luminance <= 0.5f) rm2 = luminance + luminance * saturation;  
      else                     rm2 = luminance + saturation - luminance * saturation;
      rm1 = 2.0f * luminance - rm2;   
      r   = ToRGB1(rm1, rm2, hue + 120.0f);   
      g = ToRGB1(rm1, rm2, hue);
      b  = ToRGB1(rm1, rm2, hue - 120.0f);
    }

    ret = ((DWORD)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)));

    return ret;
}


unsigned char cColorPicker::ToRGB1(float rm1, float rm2, float rh)
{
  if      (rh > 360.0f) rh -= 360.0f;
  else if (rh <   0.0f) rh += 360.0f;

  if      (rh <  60.0f) rm1 = rm1 + (rm2 - rm1) * rh / 60.0f;   
  else if (rh < 180.0f) rm1 = rm2;
  else if (rh < 240.0f) rm1 = rm1 + (rm2 - rm1) * (240.0f - rh) / 60.0f;      

  return static_cast(rm1 * 255);
}

int _tmain(int argc, _TCHAR* argv[])
{
    vector myCols;
    cColorPicker colpick;
    colpick.Pick( myCols, 20 );
    for( int k = 0; k < (int)myCols.size(); k++ )
        printf("%d: %d %d %d\n", k+1,
        ( myCols[k] & 0xFF0000 ) >>16,
        ( myCols[k] & 0xFF00 ) >>8,
        ( myCols[k] & 0xFF ) );

    return 0;
}
0
जोड़ा
जब मैं अन्य चीजों के साथ, सभी चीजों को स्थानांतरित करने में नहीं समझता: /
जोड़ा लेखक CodeGuy
क्या होगा यदि मैं यह शामिल करना चाहता हूं कि रंग पृष्ठभूमि रंग से अलग हैं जो मैं प्रदान करता हूं?
जोड़ा लेखक CodeGuy
AFAIK यह सी ++ से जावा तक पोर्ट कोड के लिए सीधा है
जोड़ा लेखक ravenspoint
मैंने यूआरएल प्रदान किए हैं जो कोड के स्पष्टीकरण से जुड़ा हुआ है।
जोड़ा लेखक ravenspoint
जेनरेट किए गए रंगों और आपके पृष्ठभूमि रंग के बीच 'दूरी' की गणना करें। अपनी पृष्ठभूमि के सबसे नज़दीक रंग का उपयोग न करें।
जोड़ा लेखक ravenspoint
यह शायद थोड़ा सा काम करेगा लेकिन इससे खराब परिणाम मिलेंगे, सीआईईएलबीएल बेहतर है
जोड़ा लेखक adrienlucca.wordpress.com

रंगों को "अवधारणात्मक वर्दी" रंगस्थान में अधिकतम दूरी से ढूंढना सबसे अच्छा होगा, उदाहरण के लिए CIELAB (एल *, ए *, बी * आपके दूरी मीट्रिक के रूप में निर्देशांक के बीच यूक्लिडियन दूरी का उपयोग करके) और फिर अपनी पसंद के रंगस्थान में कनवर्ट करना। मानवीय दृश्य प्रणाली में गैर-रैखिकता का अनुमान लगाने के लिए रंगस्थान को ट्विक करके अवधारणात्मक एकरूपता प्राप्त की जाती है।

0
जोड़ा
यह शायद सबसे अच्छा समाधान है क्योंकि यह काफी सरल है। हालांकि सीआईई 2000 या यहां तक ​​कि सीआईईसीएएम जैसे विचार करने के लिए अन्य रंग-अंतर सूत्र भी हैं
जोड़ा लेखक adrienlucca.wordpress.com

"सबसे अंतरनीय" प्राप्त करने के लिए हमें लैब (या किसी अन्य अवधारणात्मक रैखिक रंग स्थान) जैसे आरसीबी की अवधारणात्मक रंग स्थान का उपयोग करने की आवश्यकता है। इसके अलावा, हम अंतरिक्ष के आकार को कम करने के लिए इस जगह को माप सकते हैं।

सभी संभावित मात्राबद्ध प्रविष्टियों के साथ पूर्ण 3 डी स्पेस जेनरेट करें और k = N के साथ के-साधन एल्गोरिदम चलाएं। परिणामी केंद्र / "साधन" एक-दूसरे से लगभग सबसे अलग-अलग होना चाहिए।

0
जोड़ा

मुझे यह एक पुरानी पोस्ट पता है, लेकिन मुझे इस विषय के लिए PHP समाधान की तलाश करते हुए पाया गया और अंततः एक साधारण समाधान के साथ आया:

function random_color($i = null, $n = 10, $sat = .5, $br = .7) {
    $i = is_null($i) ? mt_rand(0,$n) : $i;
    $rgb = hsv2rgb(array($i*(360/$n), $sat, $br));
    for ($i=0 ; $i<=2 ; $i++) 
        $rgb[$i] = dechex(ceil($rgb[$i]));
    return implode('', $rgb);
}

function hsv2rgb($c) { 
    list($h,$s,$v)=$c; 
    if ($s==0) 
        return array($v,$v,$v); 
    else { 
        $h=($h%=360)/60; 
        $i=floor($h); 
        $f=$h-$i; 
        $q[0]=$q[1]=$v*(1-$s); 
        $q[2]=$v*(1-$s*(1-$f)); 
        $q[3]=$q[4]=$v; 
        $q[5]=$v*(1-$s*$f); 
        return(array($q[($i+4)%6]*255,$q[($i+2)%6]*255,$q[$i%6]*255)); //[1] 
    } 
}

तो बस random_color() फ़ंक्शन को कॉल करें जहां $ मैं रंग की पहचान करता हूं, $ n संभावित रंगों की संख्या, $ संतृप्ति बैठता है और चमकती है।

0
जोड़ा
क्या आप इस मामले में "मैं" क्या समझा सकते हैं? प्रश्न एन संख्या के लिए पूछा गया। "मैं" पैरामीटर क्या है?
जोड़ा लेखक CodeGuy
समझा! स्पष्टीकरण के लिए धन्यवाद। एक और बात ... अगर मेरे पास पृष्ठभूमि रंग है तो क्या करना है और मैं सभी रंगों के लिए जितना संभव हो उससे दूर रहना चाहता हूं?
जोड़ा लेखक CodeGuy
random_color() पर, $ i रंग उत्पन्न करने के लिए "बीज" है, 0 से $ n की संख्या होना चाहिए, यदि आप इनपुट नो बीज (एनयूएलएल), फ़ंक्शन एक यादृच्छिक चुनता है। $ n किसी दिए गए संतृप्ति और चमक के लिए संभावित रंगों की मात्रा है यानी पैलेट में रंगों की संख्या। हम मूल रूप से 360 ह्यू डिग्री $ n में विभाजित कर रहे हैं और एक गुणक के रूप में $ i का उपयोग कर रहे हैं। दूसरे शब्दों में, उच्च $ n आपको अधिक रंग देगा, कम $ n आपको कम रंग देगा लेकिन एक दूसरे के लिए अधिक अलग होगा। $ i
जोड़ा लेखक Mauro
संतृप्ति और मूल्य को बनाए रखने के लिए आपको अपने रंग के रंग में 180 डिग्री जोड़ना होगा। इसके लिए एक नया प्रश्न पोस्ट करें, यहां लिंक पेस्ट करें और मैं आगे समझाऊंगा!
जोड़ा लेखक Mauro