Цветовой градиент

 

Всем доброго времени суток!
Может кто вменяемо объяснить как вычисляется цветовой градиент...

Пример: Раскрасить 8 линий индикатора в цвета радуги от красного до фиолетового. Если задачу усложнить, то не 8 а скажем 10-20, но для простоты можно взять и 8.

В свое время мне присылали образец реализации подобной задачи для MT5 но так это там мутно реализовано... что я не понял...

Заранее благодарен.

 

Вот тут чего-то во что-то красят. Может помочь.


Файлы:
 

Ну если по-простому, есть несколько точек отсчета. Если брать радугу, скажем 7 -

(К-О-Ж-З-Г-С-Ф)
(0-1-2-3-4-5-6)

Есть количество линий для градиента - n (0..n-1) (25 допустим)

Есть линия с индексом i (7)

Находим позицию цвета линии -- double x = 6*i/(n -1); (0.25*7 = 1.75)

Далее находим две ближайших точки отсчета (1 и 2, т.е. О и Ж) и расстояние до них (0.75 и 0.25)

Далее линейно интерполируем каналы.

R(result) = (1 - 0.75)*R(О) + (1 - 0.25)*R(Ж)
G(result) = (1 - 0.75)*G(О) + (1 - 0.25)*G(Ж)
B(result) = (1 - 0.75)*B(О) + (1 - 0.25)*B(Ж)

Все, собственно.

 

https://en.wikipedia.org/wiki/HSL_and_HSV

там внизу формулы преобразования в RGB

 
Вот ещё вариант https://www.mql5.com/ru/code/9311
 

Вот тебе функция. Развлекайся.

color hsb2rgb(double Hue,         // угол в градусах
              double Saturation,  // Насыщенность в процентах
              double Brightness)  // яркость в диапазоне -1..+1
{
  Brightness = MathMax(Brightness,-1);  Brightness = MathMin(Brightness,1);
  Saturation = MathMax(Saturation,0);   Saturation = MathMin(Saturation,100);
  double Pi2=MathArcsin(1.0)*4;                   // 2*Пи
  double A =  Pi2 * Hue / 360;
  double R = MathCos(Hue)      * Saturation / 100 + Brightness * 3;
  double G = MathCos(Hue+Pi2/3)* Saturation / 100 + Brightness * 3;
  double B = MathCos(Hue-Pi2/3)* Saturation / 100 + Brightness * 3;
  int r = MathRound((R/(1.0+MathAbs(R))+4.0/5.0)*255*5/8.0);
  int g = MathRound((G/(1.0+MathAbs(G))+4.0/5.0)*255*5/8.0);
  int b = MathRound((B/(1.0+MathAbs(B))+4.0/5.0)*255*5/8.0);
  return((b<<16)+(g<<8)+r);
}

В прицепе пример (скрипт). Рисует такую вот фигулю.

На вопросы отвечу, если есть.

Функция не является фицияльным стандартом пересчёта HSB в RGB. Писал от балды.

Файлы:
colordisk.mq4  4 kb
 
MetaDriver:

Функция не является фицияльным стандартом пересчёта HSB в RGB. Писал от балды.


Вот и верь после этого людям ...

А кто такой HSB ?

 
tara:


Вот и верь после этого людям ...

А кто такой HSB ?

https://ru.wikipedia.org/wiki/HSB
 

Спасибо

[Добавлено]: Интересуетесь эргономикой?

 
tara:

Спасибо

[Добавлено]: Интересуетесь эргономикой?

Чо? Я дажи слова такова низнаю. Эта про заборы? :)

 
MetaDriver:

Чо? Я дажи слова такова низнаю. Эта про заборы? :)


Не чо, а що

[Добавлено]: Это - когда что-нибудь показываешь, и все тебя понимают.

Причина обращения: