2011-03-29 17 views
5

मेरे एप्लिकेशन में एक लाइन ग्राफ़ है जो एक बार में 20 या अधिक डेटासेट प्रदर्शित कर सकता है, लेकिन आमतौर पर यह 5 से कम प्रदर्शित होगा। मैं प्रत्येक डेटासेट को एक अद्वितीय रंग रखना चाहता हूं।मैं विपरीत रंग कैसे उत्पन्न करूं?

वर्तमान में मैं यह कर रहा हूँ:

setHsl(i * 255.0/session->getNumDataSets(), 255, 128); 

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

रंग उत्पन्न करने का एक बेहतर तरीका क्या है?

double pos = 0; 
if (wheel.size() == 0) 
{ 
    wheel.append(0.0); 
    wheel.append(1.0); 
} 
else 
{ 
    double gap = 0; 
    double hi = 0; 
    double lo = 0; 

    for (int i = 0; i < wheel.size() - 1; i++) 
    { 
     double g = wheel[i + 1] - wheel[i]; 
     if (g > gap) 
     { 
      gap = g; 
      lo = wheel[i]; 
      hi = wheel[i + 1]; 
     } 
    } 

    pos = (hi - lo)/2.0 + lo; 

    wheel.append(pos); 
    qSort(wheel); 
} 

QColor c; 
c.setHsl(pos * 255.0, 255, 128); 
return c.toRgb(); 

मेरा विचार है कि पहले रंग, रंग चक्र पर स्थिति 0 है:

यहाँ मेरी दूसरा प्रयास है। फिर प्रत्येक निम्नलिखित रंग के लिए, मैं कलर व्हील के चारों ओर जाता हूं, रंगों के बीच सबसे बड़ा अंतर ढूंढता हूं, और एक बार जब मैंने इसे पाया, तो मैं उस अंतर में एक नया रंग डालता हूं। ऐसा लगता है कि यह बेहतर काम करता है, लेकिन फिर भी सही नहीं है, क्योंकि अंतराल कम हो जाने के बाद, लगातार रंग समान होते हैं।

+0

अधिकतम अनुबंध आमतौर पर शुद्ध रंगों (चमकदारता = 120, संतृप्ति = 240) के साथ किया जाता है, और वास्तव में आपके जैसा ह्यू चुनते हैं। – Wrikken

+0

वह अब इस तरह के रंग को नहीं चुनना चाहता क्योंकि आसन्न रंग काफी समान हैं। – Reinderien

+0

मैंने अभी भी एक ब्लॉग पोस्ट को रेडडिट या हैकर समाचार पर देखा है जो इस समस्या को अच्छी तरह से हल करता है, लेकिन अब मुझे यह नहीं मिल रहा है। –

उत्तर

3

आप की तरह कुछ कर सकता है:

int n = session->getNumDataSets(); 
setHsl((((i%3) * n/3)+(i/3)) * 255.0/n, 255, 128); 

मैं अपने गणित की अच्छी तरह जांच करने के लिए होगा, लेकिन मूल रूप से यह स्पेक्ट्रम के तिहाई के माध्यम से घूमता है।

+0

काफी काम नहीं करता है, वैकल्पिक आदेशों में समान 3 रंग देता है, लेकिन मुझे लगता है कि मैं आपका इरादा समझता हूं। –

+0

इसे अभी आज़माएं - उन मोडों में से एक विभाजन होना चाहिए था। – Reinderien

+0

बहुत अच्छा लगता है, धन्यवाद। और मेरे प्रयास # 2 से बहुत आसान है। रंग-अंधे उपयोगकर्ताओं के लिए सुलभता पर विचार करने के लिए –

5

मुझे पता है कि आप ग्राफ के रंगों को कम्प्यूटेशनल रूप से उत्पन्न करने के लिए एक तरीके से पूछ रहे हैं, लेकिन आप एक कस्टम पैलेट को डिजाइन करने और पूर्व-संग्रहित तालिका से रंग ढूंढने पर विचार करना चाहेंगे।

इसका लाभ यह है कि आप उन रंगों का चयन तैयार कर सकते हैं जो रंग अंधे उपयोगकर्ताओं के लिए विशिष्ट हैं। आप VisCheck जैसे टूल का उपयोग करके यह देखने के लिए देख सकते हैं कि आपका ग्राफ अंधे उपयोगकर्ताओं को रंग कैसे दिखाई देगा।

यदि आपके पास 20 से अधिक डेटा सेट हो सकते हैं तो मुझे लगता है कि रंग अकेले रंग में अंतर करना बहुत कठिन हो सकता है, लेकिन रंगों को एक और विभेदक के साथ संयोजन में पुन: उपयोग किया जा सकता है, जैसे धराशायी रेखाएं।

+0

+1। –

2

एचएसएल का उपयोग न करें। यह त्रुटियां हैं कि एचएसएल (या बस खराब, एचएसवी) में संख्यात्मक रूप से "अलग दिखने वाले रंग" रंग आपकी आंखों में समान दिखते हैं। इसके बजाय वाईयूवी (उर्फ वाईसीबीसीआर) का उपयोग करें।

Y = 0.3*R + 0.6*G + 0.1*B 

(आमतौर पर अधिक फ़ाइन-ट्यून गुणांक हैं: YUV के मूल विचार है, अगर आप परिचित नहीं हैं, निर्देशांक में एक रेखीय परिवर्तन जहां पहले अक्ष अवधारणात्मक तीव्रता है बनाने के लिए, की तरह कुछ है उपयोग किया जाता है, लेकिन ये सरल हैं जो आपको वजन का एक अंदाजा देते हैं)

दूसरी और तीसरी अक्ष को फिर विमान ऑर्थोगोनल में वाई अक्ष में दो वैक्टर के रूप में चुना जाता है, अक्सर मोटे तौर पर "लाल" और " नीला "दिशानिर्देश।

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

2

जावा उत्पन्न ग्राफ पर विभिन्न डेटासेट के लिए समान रूप से दूरी वाले रंग बनाने के लिए मैं जावा में निम्न फ़ंक्शन का उपयोग करता हूं। इसकी छोटी और मीठी:

/** 
* This function splits the red-green-blue colour wheel into n equally spaced divisions 
* and returns the colour from a particular division. 
* 
* @param index The index of the colour to return, the range is 0 - (count-1) 
* @param count The number of divisions to split the HSV colour wheel into 
* @return A java.awt.Color object containing the colour. 
* @author HughesR 
*/ 
public static Color getSpacedOutColour(int index, int count) { 
    final float saturation = 0.95f; // Saturation 
    final float brightness = 0.8f; // Brightness 
    float hue = (float)index/(float)count; 
    return Color.getHSBColor(hue, saturation, brightness); 
} 
+0

यह वह दृष्टिकोण है जिसका मैं उपयोग करता हूं। बहुत ही सुविधाजनक। संबंधित क्यू/ए [यहां] (http://stackoverflow.com/a/3403970/276052)। – aioobe

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