2016-09-29 6 views
0

ich umsetzen möchte eine Funktion in C++/Realbasic einen Farbverlauf von den Parametern zu erstellen:Linear Gradient mit Winkel & Kraft

  1. Breite und Höhe des Bildes
  2. 2 Farben des Gradienten
  3. Winkel (Richtung) des Gradienten
  4. Stärke des Gradienten

die folgenden Verbindungen zeigen einige Beispiele für den gewünschten Ausgang i Magier: http://www.artima.com/articles/linear_gradients_in_flex_4.html, http://i.stack.imgur.com/4ssfj.png

Ich habe mehrere Beispiele gefunden, aber sie geben mir nur vertikale und horizontale Verläufe, während ich zu den Winkel und die Stärke angeben möchten.

Kann mir bitte jemand helfen?

S.S .: Ich weiß nur wenig über Geometrie !! :(

+1

Bitte [Bearbeiten] Ihre Frage zu zeigen, [was Sie bisher versucht haben] (http: // whathaveyoutried .com). Sie sollten eine [mcve] des Codes einbeziehen, mit dem Sie Probleme haben, dann können wir versuchen, mit dem spezifischen Problem zu helfen. Sie sollten auch [fragen] lesen. –

+0

Ich bin mir nicht sicher, was du mit "Stärke" meinst. Die Opazität des gesamten Gradienten, d.h. – plasmacel

Antwort

0

Ihre Frage ist sehr breit und wie es ist, ist dies eine ziemlich komplexe Übung mit viel Code, einschließlich Bild-Rendering, Umgang mit Bildformaten, Schreiben von Datei auf die Festplatte, etc. Dies sind nicht die Angelegenheit einer einzigen Funktion. aus diesem Grunde konzentriere ich mich auf einen beliebigen linearen Farbverlauf von 2 Farben machen.

linear Farbverlauf

Sie können linear interpolation zwischen zwei Farben einer lineare Farbe „Gradient“ erstellen. Allerdings einfache linearem Interpolation macht wirklich hart aussehende Übergänge.Für optisch ansprechendere Ergebnisse empfehle ich eine Art vonzu verwendenInterpolationskurve wie die Hermite-Interpolation basiert smoothstep.

Linear color gradient

den Winkel betrifft, so kann man ein Liniensegment durch den Start (p0) und Ende (p1) Punkte des Farbgradienten definieren. Nennen wir den Abstand zwischen ihnen d01, also d01 = distance(p0, p1). Dann müssen Sie für jeden Pixelpunkt des Bildes den nächsten Punkt p2 in diesem Segment berechnen. Here is an example wie das geht. Dann berechne t = distance(p0, p2)/d01. Dies ist der lerp Parameter t im Bereich [0, 1]. Interpolieren Sie zwischen den 2 Farbverlauf von diesem t und Sie haben die Farbe für den angegebenen Punkt p.

Dies kann auf mehrere Arten implementiert werden. Sie können OpenGL verwenden, um das Bild zu rendern, und dann den Pixelpuffer zurück zum RAM lesen. Wenn Sie mit OpenGL oder dem Rendering-Prozess nicht vertraut sind, können Sie eine Funktion schreiben, die einen Punkt (die 2D-Koordinaten eines Pixels) verwendet und eine RGB-Farbe zurückgibt - so können Sie alle Pixel des Bildes berechnen. Schließlich können Sie das Bild mit einem Bildformat auf die Festplatte schreiben, aber das ist eine andere Geschichte.


Im Folgenden finden Sie Beispiele für C++ 14-Implementierungen einiger der oben genannten Funktionen.

einfache lineare Interpolation:

template <typename T, typename U> 
T lerp(const T &a, const T &b, const U &t) 
{ 
    return (U(1) - t)*a + t*b; 
} 

, wo a und b sind die beiden Werte (Farben in diesem Fall), die Sie zwischen interpoliert werden sollen, und t ist der Interpolationsparameter im Bereich [0, 1], die den Übergang zwischen a und b darstellt.

Natürlich erfordert die obige Funktion einen Typ T, der die Multiplikation mit einem Skalar unterstützt. Zu diesem Zweck können Sie einfach einen beliebigen 3D-Vektortyp verwenden, da Farben tatsächlich Koordinaten im Farbraum sind.

Abstand zwischen zwei 2D-Punkte:

#include <cmath> 

auto length(const Point2 &p) 
{ 
    return std::sqrt(p.x*p.x + p.y*p.y); 
} 

auto distance(const Point2 &a, const Point2 &b) 
{ 
    Point delta = b - a; 
    return length(delta); 
} 

Bild von https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient

+0

Vielen Dank für Ihre vollständige und erschöpfende Erklärung !! :) – Joseph86