Подтвердить что ты не робот

Вычислить цвет в данной точке на градиенте между двумя цветами?

Итак, это по существу метод, который я хотел бы написать (в Objective-C/Cocoa, используя UIColors, но меня действительно интересует основная математика):

+ (UIColor *)colorBetweenColor:(UIColor *)startColor andColor:(UIColor *)endColor atLocation:(CGFloat)location;

Итак, в качестве примера, скажем, у меня два цвета, чистый красный и чистый синий. Учитывая линейный градиент между ними, я хочу рассчитать цвет, который, скажем, на отметке 33% на этом градиенте: Example
Поэтому, если я должен был вызвать свой метод следующим образом:

UIColor *resultingColor = [UIColor colorBetweenColor:[UIColor redColor] andColor:[UIColor blueColor] atLocation:0.33f];

Я бы получил результирующий цвет в 'B' и аналогичным образом передал 0.0f, так как местоположение вернет цвет "A", а 1.0f вернет цвет "C".

Итак, в основном, мой вопрос: как я могу смешать значения RGB двух цветов и определить цвет в определенном "месте" между ними?

4b9b3361

Ответ 1

Вы просто линейно интерполируете красный, зеленый и синий каналы следующим образом:

double resultRed = color1.red + percent * (color2.red - color1.red);
double resultGreen = color1.green + percent * (color2.green - color1.green);
double resultBlue = color1.blue + percent * (color2.blue - color1.blue);

где percent - значение от 0 до 1 (location в вашем первом прототипе метода).

Ответ 2

Цветовое пространство RGB похоже на круг. С наивысшим насыщением вдоль внешней границы и сером посередине. Путешествуя от одного цвета к другому, вы бы хотели, чтобы вы делали это по одному радиусу (окружности) с середины; где насыщенность и значение остаются неизменными. В этом случае оттенок изменяется линейным образом. Вы не пересекаетесь в более серой области, чем изначально слева и справа. Вы можете перемещаться от внутреннего кольца к внешнему кольцу, просто поднимая (или вниз) насыщение; снова линейно. См. здесь для цветового круга (попробуйте его, например, paint.net).

Объектные классы Apple (iOS) позволяют работать с другими спектрами, чем с RGB.