Вычислить цвет в данной точке на градиенте между двумя цветами?
Итак, это по существу метод, который я хотел бы написать (в 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 двух цветов и определить цвет в определенном "месте" между ними?
Ответы
Ответ 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.