Карта цветов радуги в RGB - PullRequest
       13

Карта цветов радуги в RGB

3 голосов
/ 01 апреля 2011

Предположим, у меня есть класс RainbowColorsMapper с конструктором RainbowColorsMapper(int n), где n> = 2. Теперь я хочу иметь непрерывное отображение цветов радуги от красного до фиолетового, которое я получаю, используя метод mapper.getColor(int number), где низкие значения соответствуют красному концу, а высокие - от n до фиолетового. Если n = 2, mapper.getColor(0) возвращает самый левый цвет спектра (около красного), а mapper.getColor(1) возвращает самый правый цвет. То же самое с большим n с автоматическим масштабированием.

Мой вопрос: можно ли сделать это относительно легко, и если да, каковы предложения по алгоритму?

Ответы [ 6 ]

7 голосов
/ 01 апреля 2011

Самый простой способ сделать это - работать в цветовом пространстве HSL , а не в RGB. Создайте цвета, в которых насыщенность и яркость будут фиксированными (до 100% и 50%, я бы посоветовал), а оттенок варьируется между подходящими конечными точками (которые вам, возможно, придется поэкспериментировать, чтобы найти). Преобразуйте значения HSL в RGB, используя Color.getHSBColor .

1 голос
/ 01 апреля 2011

Помните, что цвета радуги упорядочены в соответствии с длиной волны, поэтому в вашей модели n как-то связано с длиной волны. Таким образом, ваш вопрос сводится к отображению длины волны (n) в RGB. Это не совсем тривиальный процесс, но для начала вы можете проверить этот вопрос:

Преобразование частоты света в RGB?

0 голосов
/ 01 апреля 2011

HSL Color позволяет легко это сделать.

0 голосов
/ 01 апреля 2011

это довольно легко, как только вы поймете это.Код внизу позволит вам переключаться между всеми существующими цветами RGB

  private int r=255;
  private int g=0;
  private int b=0;
  private void nextRGB()
  {
    if ( r == 255 && g < 255 && b == 0 )
      {
      g++;
      }
    if ( g == 255 && r > 0 && b == 0 )
      {
      r--;
      }
    if ( g == 255 && b < 255 && r == 0 )
      {
      b++;
      }
    if ( b == 255 && g > 0 && r == 0 )
      {
      g--;
      }
    if ( b == 255 && r < 255 && g == 0 )
      {
      r++;
      }
    if ( r == 255 && b > 0 && g == 0 )
      {
      b--;
      }
  }
  public Color nextColor()
  {
  nextRGB();
  return makeColor();
  }

  private Color makeColor()
  {
    return new Color(r, g, b);
  }
0 голосов
/ 01 апреля 2011

У вас в основном есть изменение оттенка от 0 до 300 в цветовой модели

Как рассчитать RGB по оттенку, который вы можете найти в Википедии

0 голосов
/ 01 апреля 2011

Или используйте цветовую модель Hue Saturation Value и выполняйте итерации по Hue.

...