2014-03-06 10 views
30

Das ist also im Wesentlichen die Methode Ich mag würde schreiben (in Objective-C/Cocoa, mit UIColors, aber ich bin wirklich nur daran interessiert in der zugrundeliegenden Mathematik):Berechnen Sie die Farbe an einem bestimmten Punkt auf einem Farbverlauf zwischen zwei Farben?

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

So als Beispiel sagen Ich habe zwei Farben, rein rot und rein blau. Bei einem linearen Gradienten zwischen den beiden, möchte ich die Farbe berechnen, ist, sagen wir, die 33% -Marke auf dieser Steigung: Example
Also wenn ich meine Methode nennen wie so:

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

Ich würde die resultierende Farbe bei "B" erhalten, und in ähnlicher Weise würde 0.0f als die Position die Farbe "A" zurückgeben, und 1.0f würde die Farbe "C" zurückgeben.

Also meine Frage ist, wie würde ich gehen über das Mischen der RGB-Werte von zwei Farben und die Bestimmung der Farbe an einem bestimmten "Ort" zwischen ihnen?

+0

Vielleicht möchten Sie sich [diese Antwort] (http://stackoverflow.com/questions/12554614/maths-for-color-gradient) ansehen – andreamazz

Antwort

41

Sie einfach linear den roten interpolieren, die grünen und die blauen Kanäle wie folgt aus:

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

wo percent einen Wert zwischen 0 und 1 (location in Ihrem ersten Prototyp-Methode).

+1

Dies funktioniert nur, wenn Sie den RGB-Raum verwenden. –

+0

@LudovicLandry Können Sie es ausarbeiten? Sie können Farben in jedem Farbraum linear interpolieren, auch wenn die Ergebnisse nicht immer erfreulich sind oder Ihren Erwartungen entsprechen. (Tatsächlich passiert man selbst in RGB oft Grau, was manchmal nicht erwünscht ist.) Inwiefern funktioniert das oben Gesagte nicht für welche Farbräume? – user1118321

+0

Zum Beispiel funktioniert dies nicht mit [UIColor whiteColor], da dies nicht in RGB ist. Siehe http://stackoverflow.com/questions/4700168/get-rgb-value-from-uicolor-presets –

1

RGB-Farbraum ist wie ein Kreis. Mit höchster Sättigung entlang der äußeren Grenze und grau in der Mitte. Wenn du von einer Farbe zur nächsten reist, solltest du das am besten tun, entlang des gleichen Radius (Kreis) von der Mitte; wo Sättigung und Wert gleich bleiben. In diesem Fall ändert sich der Farbton auf lineare Weise. Sie werden nicht in mehr Graubereich als Ihre linken und rechten Farben anfänglich sind. Sie können von einem inneren Ring zu einem äußeren Ring reisen, einfach die Sättigung nach oben oder unten gehen; wieder linear. Siehe here für Farbkreis (versuchen Sie es zum Beispiel in paint.net)

Apples (iOS) Objektiv Klassen können Sie mit anderen Spektren als RGB arbeiten.

+2

RGB ist nicht wie ein Kreis, es ist ein Würfel. Räume wie HSV oder HSB bilden einen Kreis mit dem Farbton in Grad oder Bogenmaß. – Henrik

Verwandte Themen