Вам нужно интерполировать между 0 и 255 и использовать интерполированное значение как красное, зеленое или синее значение вместо прямого использования компонента времени, если вы хотите использовать полный диапазон цветов. Это потому, что каждый компонент цвета представлен по 1 байту.
Вы в основном растягиваете свои 0-24 часа до значений 0-255, где Hour = 0 соответствует Red = 0, а Hour = 24 соответствует Red = 255.
Dim R As Byte = CByte(Date.Now.Hour / 23 * 255)
Это очень похоже на ваш подход «11% красного». Остальные части будут определены аналогично,
Dim G As Byte = CByte(Date.Now.Minute / 59 * 255)
Dim B As Byte = CByte(Date.Now.Second / 59 * 255)
Формула линейной интерполяции в общем случае
New_Value = (Value - Min) / (Max - Min) * (New_Max - New_Min) + New_Min
Здесь Min и New_Min равны 0, что несколько упрощает формулу.
Чтобы фактически назначить цвет, вам не нужно устанавливать его путем создания цвета HTML. Вы просто можете использовать функцию Color.FromArgb
. Просто введите его в Visual Studio. По какой-то причине IntelliSense (функция, которая показывает, какие методы доступны при вводе текста в среде IDE) в некоторых случаях скрывает эту функцию.
Me.BackColor = Color.FromArgb(R, G, B)
Это ничем не отличается от вашего подхода HTML, только проще (значение #321224
- это просто представление трех байтов в шестнадцатеричном виде в форме #RRGGBB
).
В самом строгом смысле приведенный выше ответ - это не совсем то, что вы хотели использовать. Чтобы использовать свой процентный подход, вы должны построить значения RGB как
Dim R As Byte = CByte(Date.Now.Hour / 100 * 255)
Dim G As Byte = CByte(Date.Now.Minute / 100 * 255)
Dim B As Byte = CByte(Date.Now.Second / 100 * 255)
но это также не даст вам полного цветового диапазона (даже 59% от 255 составляет всего 150, поэтому вы никогда не увидите значения между 150 и 255). Лучше всего использовать линейную интерполяцию.
person
Jens
schedule
31.12.2014