রঙ চাকা তৈরির জন্য ফাংশন

এই আমি অনেক সময় ছদ্ম-সমাধান করেছি এবং বেশ কিছুটা সমাধান পাইনি। এটা আমার সাথে আটকে আছে সমস্যাটি N রং তৈরি করার একটি উপায় নিয়ে আসতে হবে, যেটি যতটা সম্ভব আলাদা আলাদা হতে পারে যেখানে N একটি প্যারামিটার।

0
যোগ সম্পাদিত
মতামত: 2
সর্বশেষ আমি চেক করেছি JFreeChart এই সুনির্দিষ্ট অ্যালগরিদমটি এবং এটি মুক্ত উত্স হিসাবে আপনি এটি পরীক্ষা করে দেখতে পারেন । আমি জানি যে আমি যে রংগুলি পেয়েছি সেটি কোনও বৃত্ত বা গোলকের সাথে স্পষ্টভাবে স্পেসে নেই, বরং আরো বিশেষভাবে নির্বাচন করা হয়েছে।
যোগ লেখক Kathy Van Stone, উৎস

8 উত্তর

আমার এই প্রথম চিন্তার "কিভাবে একটি মহাশূন্য N ভেক্টর তৈরি যে একে অপরের থেকে দূরত্ব সর্বাধিক।" আপনি দেখতে পারেন যে RGB (অথবা যে কোনও স্কেল যা আপনি এটি ব্যবহার করেন যেটি রঙের একটি ভিত্তি তৈরি করে) শুধু ভেক্টর। র্যান্ডম পয়েন্ট পিকিং এ একটি নজর দিন। আশা করি আপনার জন্য এটি একটি ভাল শুরু! একবার আপনি একটি অংশ সর্বাধিক যে vectors একটি সেট আছে, আপনি পরে একটি হ্যাশ টেবিল বা কিছু তাদের সংরক্ষণ করতে পারেন, এবং আপনি একে অপরের থেকে সর্বাধিক পৃথক হয় যে ইচ্ছা সব রং পেতে তাদের র্যান্ডম ঘূর্ণন সঞ্চালন!

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:

n = 10 আমরা জানি আমরা 16777216 রং আছে (256 ^ 3)। আমরা ব্যবহার করতে পারেন buckles অ্যালগরিদম 515 লেক্সিকোগ্রাফিক ইনডেক্সযুক্ত রঙ খুঁজে পেতে । \ frac {\ বিনোম {256 ^ 3} {3}} {n} * i। আপনি সম্ভবত ওভারফ্লো এড়াতে অ্যালগরিদম সম্পাদনা করতে হবে এবং সম্ভবত কিছু ছোট গতি উন্নতি যোগ করতে হবে।

0
যোগ
আমি লজিকাল শব্দ আরজিবি বেশিরভাগই বেগুনি এবং কমলা হাইব্রিড তৈরি করে এবং অপেক্ষাকৃত বিরলভাবে নীল সবুজ সংকর তৈরি করে ... রঙের স্কেলটি নিম্ন লাল থেকে গভীর নীল রঙের একটি ইউনিফর্ম। একটি রামধনু ভিত্তিক algo প্রয়োজন
যোগ লেখক com.prehensible, উৎস
StackExchange রঙ থিওরি সাইটটি আপভোটিং / অনুসরণ বিবেচনা করুন: area51.stackexchange.com/proposals/110687/color-theory// একটি>
যোগ লেখক Adi Shavit, উৎস
এটি ভুল কারণ RGB রঙ স্পেস অনুভূমিক ইউনিফর্ম নয়
যোগ লেখক 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);
}

কিন্তু এই পদ্ধতি উল্লেখযোগ্যভাবে আপনার অ্যালগরিদম ধীরে ধীরে হবে।

আরেকটি উপায় randomness স্ক্র্যাপ এবং পদ্ধতিগতভাবে প্রতিটি 4 মান মাধ্যমে যেতে হবে এবং উপরোক্ত উদাহরণ একটি অ্যারের একটি রং যোগ করা হবে।

0
যোগ

এটি একটি ফ্যাক্টর নয় যা আপনি রং সেট আপ?

আপনি Dillie-Os ধারণা ব্যবহার করে যদি আপনি যতটা সম্ভব রং মিশ্রিত করা প্রয়োজন মত। 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
যোগ
প্রত্যক্ষভাবে আলাদা আলাদা আলাদা আলাদা রঙ প্যালেট নির্বাচন করার জন্য RGBland escaping একটি অবশ্যই পড়তে হবে।
যোগ লেখক Drake Guan, উৎস

এখানে কিছু নির্দিষ্ট বিন্যাসের HSL রঙের চক্রের সমানভাবে RGB রং বরাদ্দ করার জন্য কিছু কোড।

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, উৎস
আমি কি কোড আছে ব্যাখ্যা এর লিঙ্ক যে URL গুলি প্রদান করেছেন।
যোগ লেখক ravenspoint, উৎস
উত্পন্ন রং এবং আপনার পটভূমির রঙের মধ্যে 'দূরত্ব' গণনা করুন। আপনার পটভূমির সবচেয়ে নিকটবর্তী রঙ ব্যবহার করবেন না।
যোগ লেখক ravenspoint, উৎস
এটি হয়তো কিছুটা কাজ করবে কিন্তু এটি দরিদ্র ফলাফল দেবে, CIELAB ভাল
যোগ লেখক adrienlucca.wordpress.com, উৎস

একটি "প্রতীয়মান ইউনিভার্সাল" রংপেসে সর্বাধিক দূরত্বে রং পেতে সর্বোত্তম হবে, যেমন CIELAB (আপনার দূরত্ব মেট্রিক হিসাবে L *, a *, b * স্থানাঙ্কের মধ্যে ইক্লিডিয়ান দূরত্ব ব্যবহার করে) এবং তারপর আপনার পছন্দের রং প্যাটারিতে রূপান্তর করুন। মানুষের ভিসুয়াল সিস্টেমে নন-লিনিয়াররিটিস আনুমানিক আনুপাতিকভাবে রংপেসকে স্পর্শকাতর এককত্ব দ্বারা অর্জন করা হয়।

0
যোগ
এটি সম্ভবত সেরা সমাধান হিসাবে এটি বেশ সহজবোধক হয়। তবে CIE2000 বা এমনকি CIECAM মত বিবেচনা করার জন্য অন্যান্য রং-পার্থক্য ফর্মুলাস রয়েছে
যোগ লেখক adrienlucca.wordpress.com, উৎস

"সবচেয়ে আলাদা আলাদা" অর্জন করার জন্য আমাদের ল্যাব (অথবা অন্য যে কোনও প্রত্যন্ত রৈখিক রঙের স্থান) এবং RGB নয় এমন একটি অনুভুতিগত রঙের স্থান ব্যবহার করতে হবে। এছাড়াও, আমরা স্পেসের আকার কমাতে এই স্থানটি পরিমাপ করতে পারি।

সমস্ত সম্ভাব্য quantized এন্ট্রি দিয়ে পূর্ণ 3D স্থান তৈরি করুন এবং k = N দিয়ে K- মানে অ্যালগরিদম চালান। ফলস্বরূপ কেন্দ্র / "মানে" একে অপরের থেকে প্রায় বেশিরভাগ আলাদা হতে হবে।

0
যোগ

আমি এই একটি পুরানো পোস্ট জানি কিন্তু বিষয় এটি একটি পিএইচপি সমাধান খুঁজছি এবং অবশেষে একটি সহজ সমাধান সঙ্গে এসেছিলেন:

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() ফাংশনটি কল করুন যেখানে $ i রঙ সনাক্ত করে, $ n সম্ভাব্য রংগুলির সংখ্যা, $ saturation saturation এবং $ br উজ্জ্বলতা।

0
যোগ
আপনি এই ক্ষেত্রে কি "আমি" ব্যাখ্যা করতে পারেন? প্রশ্ন এন নম্বর জন্য জিজ্ঞাসা। "আমি" পাম্পার কি?
যোগ লেখক CodeGuy, উৎস
আমি দেখি! বর্নানার জন্য ধন্যবাদ. আরেকটি জিনিস ... আমার কোনও পটভূমির রঙের জন্য কি কোন পরামর্শ আছে এবং আমি যতটা সম্ভব যতটা সম্ভব সব রঙের জন্য তা হতে চাই?
যোগ লেখক CodeGuy, উৎস
random_color() , $ i তে, রঙ তৈরি করতে "বীজ" হয়, 0 থেকে $ n এর একটি সংখ্যা হওয়া উচিত, যদি আপনি ইনপুট কোন বীজ (NULL), ফাংশন একটি র্যান্ডম এক বাছাই। $ n হল একটি নির্দিষ্ট স্যাচুরেশন এবং উজ্জ্বলতার জন্য সম্ভাব্য রংগুলির পরিমাণ, যা প্যানেলে রঙের সংখ্যা। আমরা মূলত 360 টি রঙের ডিগ্রীকে $ n এ বিভক্ত করছি এবং একটি গুণক হিসাবে $ i ব্যবহার করছি অন্য কথায়, উচ্চতর $ n আপনাকে আরো রং দেবে, নিম্ন $ n আপনাকে কম রং দেবে কিন্তু একে অপরের থেকে ভিন্ন হবে। $ i রঙটি চিহ্ন
যোগ লেখক Mauro, উৎস
আপনি আপনার রঙ রেনেসাঁ এবং মান বজায় রাখার 180 ডিগ্রী যোগ করতে হবে। এই জন্য একটি নতুন প্রশ্ন পোস্ট করুন, এখানে লিঙ্কটি পেস্ট করুন এবং আমি আরও ব্যাখ্যা করব!
যোগ লেখক Mauro, উৎস