2016-01-09 2 views
0

Im не 100% берега, что я делаю неправильно. Im работает над добавлением HSL цвета в мой пользовательский двигатель, и моя тестовая программа создает неправильный цвет спектра Снимок экрана: Screenshot of Program OutputHSL Цвет не работает правильно

Исходный код:

public Color toRGB() 
{ 
    float r = 0.0f; 
    float g = 0.0f; 
    float b = 0.0f; 

    float v1, v2; 

    if(_sat == 0.0f) 
    { 
     r = _lum; 
     g = _lum; 
     b = _lum; 
    } 
    else 
    { 
     if (_lum < 0.5f) 
      v2 = _lum * (1.0f + _sat); 
     else 
      v2 = (_lum + _sat) - (_lum * _sat); 

     v1 = 2.0f * _lum - v2; 

     r = GetElement(v1, v2, (_hue/360.0f) + (1.0f/3.0f)); 
     g = GetElement(v1, v2, (_hue/360.0f)); 
     b = GetElement(v1, v2, (_hue/360.0f) - (1.0f/3.0f)); 
    } 
    return new Color(r, g, b); 
} 

private static float GetElement(float v1, float v2, float vH) 
{ 
    if (vH < 0.0f) 
     vH += 1.0f; 
    else if (vH > 1.0f) 
     vH -= 1.0f; 

    if ((6.0f * vH) < 1.0f) 
    return (v1 + (v2 - v1) * 6.0f * vH); 
    if ((2.0f * vH) < 1.0f) 
     return v2; 
    if ((3.0f * vH) < 2.0f) 
     return (v1 + (v2 - v1) * 6.0f * ((1.0f/3.0f) - vH)); 
    return v1; 
} 

Код exicuted в примере программы следующим образом :

float width = GraphicsDevice.Viewport.Width; 
float height = GraphicsDevice.Viewport.Height; 

spriteBatch.Begin(); 
for (float x = 0.0f; x < width; x++) 
{ 
    for (float y = 0.0f; y < height; y++) 
    { 
     HSLColor temp = new HSLColor(((x/width) * 360.0f), 0.5f, (y/height)); 
     DrawPixel(spriteBatch, (int)x, (int)y, temp.toRGB()); 
    } 
} 

Всего несколько нот: Я использую Microsoft XNA Famework. Я не заинтересован в использовании других библиотек, и даже XNA может быть только темпом, в зависимости от того, каким образом развивается этот движок.

+0

Добро пожаловать на SO. Было бы полезно узнать, что именно вы ожидаете. – m00am

ответ

0

Вот что я разработал для GetElement:

private static float GetElement(float v1, float v2, float vH) 
{ 
    if (vH < 0.0f) 
     vH += 1.0f; 
    else if (vH > 1.0f) 
     vH -= 1.0f; 

    if (6.0f * vH < 1.0f) 
     return v1 + (v2 - v1) * 6.0f * vH; 
    if (3.0f * vH < 1.0f) 
     return v2; 
    if (2.0f * vH < 1.0f) 
     return v1 + (v2 - v1) * 6.0f * (0.5f - vH); 
    return v1; 
} 

Я не проверял, но она выглядит хорошо для меня. В любом случае вы заметите, что первые два if s идентичны вашим. Ошибки, безусловно, находятся в третьем if.

И это только придираться, но я бы немного улучшить точность параметров цветового тона, как так:

r = GetElement(v1, v2, (_hue + 120.0f)/360.0f); 
    g = GetElement(v1, v2, _hue/360.0f); 
    b = GetElement(v1, v2, (_hue - 120.0f)/360.0f);