Obliczyć kolor w danym punkcie na gradiencie między dwoma kolorami?
Więc jest to zasadniczo metoda, którą chciałbym napisać (w Objective-C/Cocoa, używając UIColors
, ale naprawdę interesuje mnie tylko podstawowa matematyka):
+ (UIColor *)colorBetweenColor:(UIColor *)startColor andColor:(UIColor *)endColor atLocation:(CGFloat)location;
Jako przykład, powiedzmy, że mam dwa kolory, czysty czerwony i czysty niebieski. Biorąc pod uwagę liniowy gradient między tymi dwoma, chcę obliczyć kolor, który ma, powiedzmy, znak 33% na tym gradiencie:
Więc gdybym tak nazwał moją metodę:
UIColor *resultingColor = [UIColor colorBetweenColor:[UIColor redColor] andColor:[UIColor blueColor] atLocation:0.33f];
Otrzymałbym uzyskany kolor na 'B' i podobnie, przechodząc 0.0f
jako lokalizacja zwróci kolor 'A', a 1.0f
zwróci Kolor 'C'.
Więc w zasadzie moje pytanie brzmi, jak mógłbym przejść o mieszanie wartości RGB dwóch kolorów i określenie koloru w pewnej "lokalizacji" między nimi?
3 answers
Po prostu liniowo interpolujesz kanały czerwone, zielone i niebieskie w ten sposób:]}
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);
Gdzie percent
jest wartością pomiędzy 0 a 1 (location
w pierwszym prototypie metody).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-26 00:36:54
Przestrzeń kolorów RGB jest jak okrąg. Z najwyższym nasyceniem wzdłuż zewnętrznej granicy i szarym pośrodku. Podróżując z jednego koloru do drugiego, najlepiej byłoby to robić, wzdłuż tego samego promienia (okręgu) od środka; tak, aby nasycenie i wartość pozostały takie same. W takim przypadku odcień zmienia się w sposób liniowy. Nie przejdziesz do bardziej szarej strefy niż początkowo twoje lewe i prawe kolory. Można podróżować z pierścienia wewnętrznego do pierścienia zewnętrznego, proste go up (lub dół) nasycenie; ponownie liniowo. Zobacz tutaj dla okręgu koloru (spróbuj np. paint.net)
Obiektywne klasy Apple (iOS) pozwalają na pracę z innymi widmami niż RGB.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 22:12:22
Wersja Swift może być dla kogoś pomocna.
private struct Color {
let r: Int
let g: Int
let b: Int
func getColor() -> UIColor {
return UIColor(red: CGFloat(r)/255.0, green: CGFloat(g)/255.0, blue: CGFloat(b)/255.0, alpha: 1)
}
static func getGradientColor(from: Color, to: Color, percentage: CGFloat) -> Color {
precondition(percentage >= 0 && percentage <= 1)
return Color(r: from.r + Int(CGFloat(to.r - from.r) * percentage),
g: from.g + Int(CGFloat(to.g - from.g) * percentage),
b: from.b + Int(CGFloat(to.b - from.b) * percentage))
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-06 01:50:44