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: Przykład
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?

Author: blabus, 2014-03-06

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).

 45
Author: user1118321,
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.

 1
Author: LenArt,
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))
    }
}
 0
Author: 0xa6a,
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