2017-07-10 2 views
0

Angenommen, ich brauche einen linearen Farbverlauf zwischen drei Farben.Wie können lineare Farbverläufe mit mehreren Farbanschlägen erzeugt werden?

rgb(255, 000, 000) 
rgb(255, 255, 000) 
rgb(000, 255, 000) 

Wie kann ich die lineare Interpolation über eine einzige Leitung mit einer bestimmten Länge berechnen? Also eine einfache Zeile wie die folgende.

enter image description here

Wie kann ich eine Funktion, da eine Liste/Array von Farb Anschlägen schaffen, die ein anderes Array aller interpolierten Farbwerte aus dem Eingang ausgibt?

Das obige Bild ist für mich verwendbar, aber ich muss in der Lage sein, diese RGB-Arrays mit mehreren Farbstopps über eine Eingangslänge zu generieren.

Oder, eine andere Option wäre eine Funktion, um ein einzelnes Farbmuster basierend auf dem Farbstopp-Array und einem Punkt entlang einer Linie zurückzugeben.

würde, die Funktion wie folgt aussehen: sample(stops[rgb...], point, length)

ich ein paar Mal versucht, gab aber da ich keine Ahnung, wie zu starten. Ich habe versucht, es als eine Perspektive von drei verschiedenen Farbbändern zu betrachten, aber es stimmte immer noch nicht ganz überein.

Ich weiß, dass dies ein einfacher Fall von mathematischen Gehirn-Block ist, und dass dies nicht wirklich eine programmspezifische Frage ist, aber ich weiß nicht, wo ich sonst fragen soll.

S.S. Eine Antwort in irgendeiner vernünftig gesunden Programmiersprache ist in Ordnung. Versuchen Sie nicht, eine Antwort in etwas zu geben, das wie ein Regex-Muster aussieht.

Antwort

0

Sie sollten eine lineare Interpolation für jede Farbkomponente in einem bestimmten Intervall durchführen.

Wir haben N Intervalle, also N + 1 Knoten. Knoten enthält Position im Bereich 0..1 und RGB-Farbe.

RGBColor NodeColors[N+1] 
Double NodePositions[N+1] 

Um Farbe bei bestimmtem Abstand von Anfang an zu erhalten, müssen Sie Wenn Intervallnummer K.

bestimmen Linienzeichnung Ende von beginnen geht, nur aktuelle Entfernung vergleichen mit NodePositions Einträgen und Zuwachs K bei Bedarf.

DistNorm = Dist/Length; 

while (DistNorm > NodePositions[K]) 
    K++ 

Wenn Sie beliebigen Punkt auf der Linie erhalten möchten, verwenden Sie binäre Suche

K = BinarySearch(DistNorm, NodePositions) 

Wenn Sie Intervallnummer erhalten haben, berechnen lineare Interpolation über dieses Intervall

Red = NodeColors[K].Red + 
     (NodeColors[K+1].Red - NodeColors[K].Red) * 
     (DistNorm - NodePositions[K])/
     (NodePositions[K+1] - NodePositions[K]) 
same for Green, Blue 
Verwandte Themen