2011-12-21 14 views
10

मैं बात की इस तरह कर रहा हूँ:क्रमबद्ध रंग (ऑब्जेक्टिव-सी)

- (NSArray*)colors { 
    float divisor = .3333; 
    NSMutableArray *retVal = [NSMutableArray array]; 
    for (float one=0; one <= 1.0f; one += divisor) { 
     for (float two = 0; two <= 1.0f; two += divisor) { 
      for (float three = 0; three <= 1.0f; three += divisor) { 
       UIColor *color = [UIColor colorWithRed:one green:two blue:three alpha:.5]; 
       // also bad 
       // UIColor *color = [UIColor colorWithHue:one saturation:two brightness:three alpha:.5]; 
       [retVal addObject:color]; 
      } 
     } 
    } 
    return retVal; 
} 

और, जैसा कि मैंने संदिग्ध, रंग बाहर बुरी तरह के आदेश से बाहर (आंखों के लिए) आते हैं। लाल रंग लाल रंग के साथ नहीं हैं, purples के साथ purples, आदि

क्या विविध रंगों की एक सूची बनाने के लिए कोई आसान तरीका नहीं है, जो अच्छी तरह से मानव मानदंडों के अनुसार समूहीकृत है, "वह नीला दिखता है?"

+1

नहीं, आपको इसे उत्तर देना चाहिए :) – kennytm

+0

क्या, धन्यवाद @ केनीटीएम। –

उत्तर

10

यह काफी अच्छा काम करता है। यह इस तथ्य की मदद नहीं करेगा कि आपके पास दोहराए गए रंग हैं। नीचे देखें:

NSArray *sorted = [[dict allValues] sortedArrayUsingComparator:^NSComparisonResult(UIColor* obj1, UIColor* obj2) { 
    float hue, saturation, brightness, alpha; 
    [obj1 getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; 
    float hue2, saturation2, brightness2, alpha2; 
    [obj2 getHue:&hue2 saturation:&saturation2 brightness:&brightness2 alpha:&alpha2]; 
    if (hue < hue2) 
     return NSOrderedAscending; 
    else if (hue > hue2) 
     return NSOrderedDescending; 

    if (saturation < saturation2) 
     return NSOrderedAscending; 
    else if (saturation > saturation2) 
     return NSOrderedDescending; 

    if (brightness < brightness2) 
     return NSOrderedAscending; 
    else if (brightness > brightness2) 
     return NSOrderedDescending; 

    return NSOrderedSame; 
}]; 

आप आईओएस 4.x में इस तरह के घटकों (HSBA) का उपयोग कर सकते हैं:

CGFloat *components = (CGFloat *)CGColorGetComponents([color CGColor]); 
    float hue = components[0]; 
    float saturation = components[1]; // etc. etc. 

रंग दोहरा बचने के लिए: आप एक NSMutableDictionary में तत्वों डाल सकते हैं , उनके रंग-संतृप्ति-चमक जैसे प्रत्येक पर कुंजी (प्रत्येक निकटतम .10 तक गोल) ... फिर आप उस से सरणी प्राप्त करते हैं, और फिर क्रमबद्ध करें।

+0

'फ्लोट' मान' डबल' होना चाहिए, अन्यथा यह 'EXC_BAD_ACCESS' त्रुटि देता है। – aykutt

3

मुझे लगता है कि [यूआईसीओलर रंगविथह्यू: संतृप्ति: चमक: अल्फा:] का उपयोग करना आपकी सबसे अच्छी शर्त है। यदि आप संतृप्ति, चमक और अल्फा को ठीक करते हैं और बस ह्यू का उपयोग करते हैं तो आपको क्रम में सभी रंग मिलेंगे।

अधिक जानकारी के लिए the wiki for HSB देखें।

for (float hsb = 0; hsb <= 1.0f; hsb += divisor) { 
      UIColor *color = [UIColor colorWithHue:hsb saturation:1.0f brightness:1.0f alpha:.5f]; 
      [retVal addObject:color]; 
} 
+0

यदि आप एचएसबी रंग की जानकारी देखते हैं, तो आपको पूर्ण रंग स्पेक्ट्रम प्राप्त करने के लिए केवल एक लूप की आवश्यकता होगी। – thelaws

+0

वाह, यदि आप बाहरी पाश पर संतृप्ति के माध्यम से चक्र करते हैं, तो आपको एक सुसंगत दिखने वाली चीज़ मिलती है। अच्छा! +1 –

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