2013-07-09 2 views
3

Я пытаюсь написать функцию, которая может генерировать цвета между двумя цветами на основе заданного значения. Примером может объяснить это лучше ..Создайте n цветов между двумя цветами

Input ..

X : 1 
Y : 0.5 
Z : 0 

Пользователь дает любой набор color:value пар, затем входит в число (скажем, 0.75). Затем я должен генерировать цвет, который пропорционален Y и Z пропорционально (на основе их значений и входного значения). Я думал о следующем подходе.

  • Найти цвета, которые окружают значение, для 0,75 это будет 0,5 и 1.
  • Смешайте эти два цвета так или иначе, на основе значения и создавать новые цвета.

Я полностью потерял, как сгенерировать цвета, и есть ли для этого библиотеки.

ОБНОВЛЕНИЕ: Это часть более крупного проекта, над которым я работаю. Допустим, у нас есть ..

1 : X 
0 : Y 

и входы пользователей, 0,25

Я хотел бы иметь что-то ..

(X*0.25 + Y*0.75) 

, как это более близко к Y, поэтому чем выше доля , Если пользователь вводит, 0,5 .. выход должен быть

(X*0.5 + Y*0.5) 

и так далее. Я понятия не имею, как это сделать с цветами RGB.

P.S: Вопросы не относятся к языку, но я делаю это на Java.

+1

Можете ли вы поделиться еще одним примером ввода и соответствующим выходом? – Apurv

+0

Я не думаю, что микширование будет уникальным. 0,25 = 1/4 красный + 3/4 зеленый или 1/2 * желтый + 1/2 зеленый. Попробуйте иметь вес в пропорции, как трехзначное число, где abc, где a - вес красного, b зеленый и c желтый? – sukunrt

+0

Добавлено несколько подробностей. – questions

ответ

5

Вы должны смешать каждый канал цвета (красный, зеленый и синий) отдельно, как это:

Color x,y; //set by you 
float blending;//set by you 

float inverse_blending = 1 - blending; 

float red = x.getRed() * blending + y.getRed() * inverse_blending; 
float green = x.getGreen() * blending + y.getGreen() * inverse_blending; 
float blue = x.getBlue() * blending + y.getBlue() * inverse_blending; 

//note that if i pass float values they have to be in the range of 0.0-1.0 
//and not in 0-255 like the ones i get returned by the getters. 
Color blended = new Color (red/255, green/255, blue/255); 

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

var firstValue; 
var secondValue; 
var interpolation; 

var interpolated = firstValue * interpolation + 
        secondValue * (1 - interpolation); 

Но поскольку у вас есть Color-Objects в вашем случае, вы не можете интерполировать весь объект за один шаг, вы должны интерполировать каждый соответствующее значение само по себе. В конце концов вы также должны интерполировать alpha-channel, не знаете, что, поскольку вы не упомянули об этом, но для полноты я включил его в этот ответ.

+0

Это звучит как хороший подход. У меня нет четвертого канала, поэтому это не проблема. – questions

1

Вы можете использовать java.awt.Color делая somting так:

public Color mixColors(Color color1, Color color2, double percent){ 
    double inverse_percent = 1.0 - percent 
    int redPart = color1.getRed()*percent + color2.getRed()*inverse_percent 
    int greenPart = color1.getGreen()*percent + color2.getGreen()*inverse_percent 
    int bluePart = color1.getBlue()*percent + color2.getBlue()*inverse_percent 
    return new Color(redPart, greenPart, bluePart) 
} 

Edit:

Вам может понадобиться использовать правильную круглую скобку для правого напечатанного материала в нужное время, но я предполагаю, что вы может понять, что часть.

4

Цвет - это точка в трехмерном пространстве.Используемые точные координаты зависят от того, что называется «цветовым пространством», из которых несколько: RGB, HSV и т. Д. Таким образом, чтобы вычислить цвет между двумя заданными цветами, получите эти два цвета в одном цветовом пространстве и вычислите третью точку между этими двумя вдоль линии в трехмерном пространстве между ними.

Простейшим способом сделать это было бы просто сделать линейную интерполяцию для каждого из трех значений цветового пространства (например, R, G и B). Но есть еще одно осложнение, что значения координат часто не являются линейными, поэтому вы должны сначала линеаризовать их (например, цвета телевизора экспоненциальны с лямбдой около 2,2). В зависимости от вашего приложения неверно предполагается, что линейность может работать нормально в любом случае, особенно если начальные цвета уже близки.

(Как указано luk2302, добавьте четвертую координату для альфа, если необходимо).

+0

Существуют ли библиотеки для 3D-интерполяции, что для меня мало чем сложно. – questions

+0

Ум, нет, это простая формула: 25% вдоль линии от x0 до x1 - это просто (x0 + (.25 * (x1 - x0))). Просто делайте это три раза. –

Смежные вопросы