Funkció létrehozására színtárcsák

szavazat
63

Ez az, amit én már ál-megoldott, és sokszor még soha nem elég találtam megoldást.

A probléma az, hogy dolgozzon ki egy módja annak, hogy Na színek, amelyek olyan elkülöníthető lehetséges, ha Negy paraméter.

A kérdést 01/08/2008 19:42
a forrás felhasználó
Más nyelveken...                            


8 válasz

szavazat
1

Olvastam valahol, az emberi szem nem tudja megkülönböztetni kevesebb, mint 4 értékek egymástól. Tehát ez az, amit szem előtt tartani. Az alábbi algoritmus nem kompenzálja ezt.

Nem vagyok biztos, hogy ez pontosan mit akar, de ez az egyik módja annak, hogy véletlenszerűen generál nem ismétlődő szín értékek:

(Vigyázz, következetlen pszeudo-kód előtt)

//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);
      }
   }
}

Az egyik módja, hogy optimalizálni ezt a jobb láthatóság kedvéért lenne összehasonlítani a távolságot minden új szín és az összes szín a tömbben:

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);
}

De ez a megközelítés jelentősen lassíthatja a algoritmust.

Egy másik módja az lenne, hogy szüntesse meg a véletlenszerű és szisztematikus megy keresztül minden 4 értékeket, és adjunk hozzá egy színt egy tömb a fenti példában.

Válaszolt 01/08/2008 20:36
a forrás felhasználó

szavazat
3

Hát nem is olyan tényező, amely rendezés beállítja a színeket?

Mint ha használja Dillie-Os ötlet kell keverni a színeket, amennyire csak lehetséges. 0 64 128 256 az egyik a másikra. de 0 256 64 128 a kerék lenne „szét”

van ennek értelme?

Válaszolt 02/08/2008 19:16
a forrás felhasználó

szavazat
23

Az első gondolatom az ez „hogyan kell létrehozni N vektorok egy olyan térben, amelyek maximalizálják távolságra egymástól.”

Láthatjuk, hogy az RGB (vagy bármely más léptékű, hogy használja ezt alapját képezi a színtér) csak vektorok. Vessen egy pillantást a Random Point szedés . Ha van egy sor vektorok maximált szét, akkor mentse őket egy hash tábla, vagy valami később, és csak szúrópróbaszerûen forgatások őket, hogy minden szín vágysz, hogy maximálisan egymástól!

Végiggondolva ezt a problémát, hogy jobb lenne, hogy feltérképezzük a színek lineáris módon, esetleg (0,0,0) → (255255255) lexikografikusan, majd szétosztja azokat egyenletesen.

Én tényleg nem tudom, hogy mennyire jól ez működni fog, de meg kell, mert mondjuk:

n = 10

Tudjuk, 16777216 szín (256 ^ 3).

Tudjuk használni csatokat algoritmus 515 , hogy megtalálják a lexikografikusan indexelt színű. \ Frac {\ binom {256 ^ 3} {3}} {n} * i. Akkor valószínűleg meg kell szerkeszteni az algoritmus, hogy elkerüljék a túlcsordulás és valószínűleg hozzá néhány kisebb sebesség javulás.

Válaszolt 02/08/2008 20:03
a forrás felhasználó

szavazat
17

Az lenne a legjobb, hogy megtalálják a színek maximálisan távoli a „észlelés egységes” színteret, pl CIELAB (az euklideszi távolságot L *, a *, b * koordinátákat, mint a távolság metrikus) alakítjuk, majd a színtér, amelyet választott. Perceptual egyenletessége érhető el csípés a színteret, hogy közelítse a nemlinearitás az emberi vizuális rendszer.

Válaszolt 12/09/2008 20:00
a forrás felhasználó

szavazat
7

Néhány kapcsolódó források:

ColorBrewer - készletei színben tervezték, hogy maximálisan megkülönböztethető használható térképeket.

Menekülő RGBland: Színek kiválasztása az Statistical Graphics - A leíró műszaki jelentést egy sor algoritmusok generálására jó (azaz maximálisan megkülönböztethető) színkészleteket a HCI színteret.

Válaszolt 18/09/2008 17:01
a forrás felhasználó

szavazat
6

Itt van néhány kód kiosztani RGB színek egyenletesen HSL színkör meghatározott fényerő.

class cColorPicker
{
public:
    void Pick( vector<DWORD>&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<DWORD>&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<unsigned char>(rm1 * 255);
}

int _tmain(int argc, _TCHAR* argv[])
{
    vector<DWORD> 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;
}
Válaszolt 27/09/2008 17:39
a forrás felhasználó

szavazat
1

Tudom, hogy ez egy régi post, de úgy találtam, hogy míg keres egy PHP megoldást a témát, és végül egy egyszerű megoldás:

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] 
    } 
}

Tehát csak hívja a random_color () függvény, ahol $ i azonosítja a szín, $ n a számos lehetséges szín, $ ült a telítettség és $ br a fényerőt.

Válaszolt 19/10/2011 02:58
a forrás felhasználó

szavazat
0

Ahhoz, hogy „a legtöbb megkülönböztethető” meg kell használni egy észlelési színteret, mint Lab (vagy bármely más észlelés lineáris színtérben), és nem RGB. Ezen kívül arra is kvantálja ezt a helyet, hogy csökkentse a méretét a teret.

Elkészíti a teljes 3D-s térben minden lehetséges kvantált bejegyzéseket, és futtassa a K-algoritmus k=N. A kapott központok / „azt jelenti,” kell kb legtöbb distinguishabl egymástól.

Válaszolt 07/02/2014 18:43
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more