[РЕШЕНО] HSV в RGB. Нужна помощь\консультация с

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

[РЕШЕНО] HSV в RGB. Нужна помощь\консультация с

Сообщение BloodySky 07 фев 2013, 12:37

Искал на форуме, но так и не нашел перевода HSV в RGB, поэтому решил написать сам.

Собственно вот:
Синтаксис:
Используется csharp
void SetBodyColor(float H, float S, float V) {
               
                if(H >= 0 && H <=60) BodyColor = new Color(1,H/60,0);
                if(H > 60 && H <= 120) BodyColor = new Color(1-(H-60)/60,1,0);
                if(H > 120 && H <= 180) BodyColor = new Color(0,1,(H-120)/60);
                if(H > 180 && H <= 240) BodyColor = new Color(0,1-(H-180)/60,1);
                if(H > 240 && H <= 300) BodyColor = new Color((H-240)/60,0,1);
                if(H > 300 && H <= 360) BodyColor = new Color(1,0,1-(H-300)/60);
               
                BodyColor.r *= V;
                BodyColor.g *= V;
                BodyColor.b *= V;
               
                BodyColor.r += (V-BodyColor.r)*(1-S);
                BodyColor.g += (V-BodyColor.g)*(1-S);
                BodyColor.b += (V-BodyColor.b)*(1-S);
        }


BodyColor - переменная типа Color для конечного цвета. Переменные H S V задаются ползунками HorizontalSlider. H задается от 0.0 до 360.0, S и V от 0.0 до 1.0. Формулы высчитывал сам, опираясь на палитру Gimp'а.

Суть темы:
C# только изучаю, до этого владел js в плане web дизайна (скажу, что похожи таки). Так вооот. Такой функцией очень неудобно пользоваться и она громоздкая. К примеру: переменная BodyColor отвечает за цвет тела (неужели), и чтобы изменит цвет глаз, нужно эту функцию продублировать в коде, изменить ее название и заменить переменные, так же и с гривой и хвостом и с второстепенными цветами гривы\хвоста и еще много чего (гг - пони, не удивляйтесь). Если есть какой-то другой путь, чтобы не дублировать постоянно эту функцию, прошу его описание, желательно конечно, чтобы он поподробнее был. Изучаю c# преимущественно шарясь в чужих кодах и по статьям с форума.

Мои догадки: Думал, можно как-то запилить функцию, которая возвращала бы результат типа Color, который записывался бы в нужную переменную. Вроде сеттер и геттер подходят.

PS Вот полный код, в котором, пока только, задаются 3 цвета :I
Синтаксис:
Используется csharp
public class Custom : MonoBehaviour {
       
        public GameObject _body;
        public GameObject _hair;
        public GUISkin _style;
       
        private float BodyH;
        private float BodyS;
        private float BodyV;
       
        private float EyeH;
        private float EyeS;
        private float EyeV;
       
        private float HairH;
        private float HairS;
        private float HairV;
       
        private Color BodyColor;
        private Color EyeColor;
        private Color HairColor;
       
        void Start () {
                Randomize();
        }
       
        void OnGUI() {
               
                GUI.skin = _style;
               
                if(GUI.Button(new Rect(Screen.width-155,5, 150, 20), "Randomize")) Randomize();
               
                BodyH = GUI.HorizontalSlider(new Rect(Screen.width-155,30, 150, 10), BodyH, 0, 360);
                BodyS = GUI.HorizontalSlider(new Rect(Screen.width-155,45, 150, 10), BodyS, 0, 1);
                BodyV = GUI.HorizontalSlider(new Rect(Screen.width-155,60, 150, 10), BodyV, 0, 1);
               
                EyeH = GUI.HorizontalSlider(new Rect(Screen.width-155,90, 150, 10), EyeH, 0, 360);
                EyeS = GUI.HorizontalSlider(new Rect(Screen.width-155,105, 150, 10), EyeS, 0, 1);
                EyeV = GUI.HorizontalSlider(new Rect(Screen.width-155,120, 150, 10), EyeV, 0, 1);
               
                HairH = GUI.HorizontalSlider(new Rect(Screen.width-155,150, 150, 10), HairH, 0, 360);
                HairS = GUI.HorizontalSlider(new Rect(Screen.width-155,165, 150, 10), HairS, 0, 1);
                HairV = GUI.HorizontalSlider(new Rect(Screen.width-155,180, 150, 10), HairV, 0, 1);
        }
       
        void Update () {
                SetBodyColor(BodyH, BodyS, BodyV);
                SetEyeColor(EyeH, EyeS, EyeV);
                SetHairColor(HairH, HairS, HairV);
               
                _body.renderer.materials[0].color = BodyColor;
                _body.renderer.materials[0].SetColor("_OutlineColor", new Color(BodyColor.r/3,BodyColor.g/3,BodyColor.b/3));
               
                _body.renderer.materials[2].color = EyeColor;
               
                _hair.renderer.materials[0].color = HairColor;
                _hair.renderer.materials[0].SetColor("_OutlineColor", new Color(HairColor.r/3,HairColor.g/3,HairColor.b/3));
        }
       
        void Randomize() {
                BodyH = Random.Range(0.0f, 360.0f);
                BodyS = Random.Range(0.0f, 1.0f);
                BodyV = Random.Range(0.0f, 1.0f);
               
                EyeH = Random.Range(0.0f, 360.0f);
                EyeS = Random.Range(0.0f, 1.0f);
                EyeV = Random.Range(0.0f, 1.0f);
               
                HairH = Random.Range(0.0f, 360.0f);
                HairS = Random.Range(0.0f, 1.0f);
                HairV = Random.Range(0.0f, 1.0f);
        }
       
        void SetBodyColor(float H, float S, float V) {
               
                if(H >= 0 && H <=60) BodyColor = new Color(1,H/60,0);
                if(H > 60 && H <= 120) BodyColor = new Color(1-(H-60)/60,1,0);
                if(H > 120 && H <= 180) BodyColor = new Color(0,1,(H-120)/60);
                if(H > 180 && H <= 240) BodyColor = new Color(0,1-(H-180)/60,1);
                if(H > 240 && H <= 300) BodyColor = new Color((H-240)/60,0,1);
                if(H > 300 && H <= 360) BodyColor = new Color(1,0,1-(H-300)/60);
               
                BodyColor.r *= V;
                BodyColor.g *= V;
                BodyColor.b *= V;
               
                BodyColor.r += (V-BodyColor.r)*(1-S);
                BodyColor.g += (V-BodyColor.g)*(1-S);
                BodyColor.b += (V-BodyColor.b)*(1-S);
        }
       
        void SetEyeColor(float H, float S, float V) {
               
                if(H >= 0 && H <=60) EyeColor = new Color(1,H/60,0);
                if(H > 60 && H <= 120) EyeColor = new Color(1-(H-60)/60,1,0);
                if(H > 120 && H <= 180) EyeColor = new Color(0,1,(H-120)/60);
                if(H > 180 && H <= 240) EyeColor = new Color(0,1-(H-180)/60,1);
                if(H > 240 && H <= 300) EyeColor = new Color((H-240)/60,0,1);
                if(H > 300 && H <= 360) EyeColor = new Color(1,0,1-(H-300)/60);
               
                EyeColor.r *= V;
                EyeColor.g *= V;
                EyeColor.b *= V;
               
                EyeColor.r += (V-EyeColor.r)*(1-S);
                EyeColor.g += (V-EyeColor.g)*(1-S);
                EyeColor.b += (V-EyeColor.b)*(1-S);
        }
       
        void SetHairColor(float H, float S, float V) {
               
                if(H >= 0 && H <=60) HairColor = new Color(1,H/60,0);
                if(H > 60 && H <= 120) HairColor = new Color(1-(H-60)/60,1,0);
                if(H > 120 && H <= 180) HairColor = new Color(0,1,(H-120)/60);
                if(H > 180 && H <= 240) HairColor = new Color(0,1-(H-180)/60,1);
                if(H > 240 && H <= 300) HairColor = new Color((H-240)/60,0,1);
                if(H > 300 && H <= 360) HairColor = new Color(1,0,1-(H-300)/60);
               
                HairColor.r *= V;
                HairColor.g *= V;
                HairColor.b *= V;
               
                HairColor.r += (V-HairColor.r)*(1-S);
                HairColor.g += (V-HairColor.g)*(1-S);
                HairColor.b += (V-HairColor.b)*(1-S);
        }
}
 
Последний раз редактировалось BloodySky 07 фев 2013, 14:56, всего редактировалось 1 раз.
BloodySky
UNец
 
Сообщения: 5
Зарегистрирован: 05 фев 2013, 06:05

Re: HSV в RGB. Нужна помощь\консультация

Сообщение seaman 07 фев 2013, 13:10

EditorGUIUtility.HSVToRGB
В Юнити сделано так:
Синтаксис:
Используется csharp
        public static Color HSVToRGB(float H, float S, float V)
        {
            Color white = Color.white;
            if (S == 0f)
            {
                white.r = V;
                white.g = V;
                white.b = V;
                return white;
            }
            if (V == 0f)
            {
                white.r = 0f;
                white.g = 0f;
                white.b = 0f;
                return white;
            }
            white.r = 0f;
            white.g = 0f;
            white.b = 0f;
            float num = S;
            float num2 = V;
            float f = H * 6f;
            int num4 = (int) Mathf.Floor(f);
            float num5 = f - num4;
            float num6 = num2 * (1f - num);
            float num7 = num2 * (1f - (num * num5));
            float num8 = num2 * (1f - (num * (1f - num5)));
            int num9 = num4;
            switch ((num9 + 1))
            {
                case 0:
                    white.r = num2;
                    white.g = num6;
                    white.b = num7;
                    break;

                case 1:
                    white.r = num2;
                    white.g = num8;
                    white.b = num6;
                    break;

                case 2:
                    white.r = num7;
                    white.g = num2;
                    white.b = num6;
                    break;

                case 3:
                    white.r = num6;
                    white.g = num2;
                    white.b = num8;
                    break;

                case 4:
                    white.r = num6;
                    white.g = num7;
                    white.b = num2;
                    break;

                case 5:
                    white.r = num8;
                    white.g = num6;
                    white.b = num2;
                    break;

                case 6:
                    white.r = num2;
                    white.g = num6;
                    white.b = num7;
                    break;

                case 7:
                    white.r = num2;
                    white.g = num8;
                    white.b = num6;
                    break;
            }
            white.r = Mathf.Clamp(white.r, 0f, 1f);
            white.g = Mathf.Clamp(white.g, 0f, 1f);
            white.b = Mathf.Clamp(white.b, 0f, 1f);
            return white;
        }
 
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: HSV в RGB. Нужна помощь\консультация

Сообщение AndreyMust19 07 фев 2013, 13:24

Синтаксис:
Используется csharp
void func() {
//...
Color BodyColor = SetColor(H, S, V);
Color HairColor = SetColor(H, S, V);
Color EyeColor = SetColor(H, S, V);
//...
}

        static Color SetColor(float H, float S, float V) {
               Color c = Color.white;
                if (H <= 180) {
                     if (H <= 60) c = new Color(1,H/60,0);
                     else if (H <= 120) c = new Color(1-(H-60)/60,1,0);
                     else c = new Color(0,1,(H-120)/60);
                } else {
                     if (H <= 240) c = new Color(0,1-(H-180)/60,1);
                     else if (H <= 300) c = new Color((H-240)/60,0,1);
                     else c = new Color(1,0,1-(H-300)/60);
                }
                c.r *= V; c.g *= V; c.b *= V;
               
                c.r += (V-c.r)*(1-S);
                c.g += (V-c.g)*(1-S);
                c.b += (V-c.b)*(1-S);
                return c;
        }
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: HSV в RGB. Нужна помощь\консультация

Сообщение BloodySky 07 фев 2013, 13:53

seaman, спасибо огромное, немного погуглив понял, как юзать return и static. Сейчас рпосто переписал свой код, несмотря на множество "если", мне он проще кажется ^^

AndreyMust19, тоже спасибо, хоть код до твоего сообщения переписал c:
BloodySky
UNец
 
Сообщения: 5
Зарегистрирован: 05 фев 2013, 06:05


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18