2010-12-05 7 views
9

Grundsätzlich neu zu erstellen, was ich will zu tun ist, zu verstehen, wie die Werte entlang einer ‚Kurve‘ zu berechnen, wie hier im photoshop Kurven Kasten dargestellt:Wie die Mathematik hinter Photoshop Kurven

Photoshop Curves

So, gegeben N Punkte mit x zwischen 0 und 1 und y zwischen 0 und 1 - wir erstellen eine Kurve, die durch alle diese Punkte geht. Mit dieser Kurve möchte ich in der Lage sein, alle Werte der Kurve für jedes gegebene X zu berechnen.

Mit anderen Worten, ich möchte Werte der Farbe genau wie das Kurvenfeld ändern, aber programmgesteuert.

Ich habe gelesen, dass dies "catmull-rom Splines" sind - aber alles, was ich sehe, ist eine Funktion, die auf einem parametrischen T beruht - ich möchte nach Werten von x suchen können. Ich würde dies gerne in C tun, wenn möglich

+1

Ich denke, Photoshop verwendet natürliche kubische Splines - http://blog.mackerron.com/2011/01/01/javascript-cubic-splines/ –

+0

Was ist mit Polynomen? –

+0

Es tut mir leid, ich kannte die Beziehung zwischen Splines und Polynomen nicht. Splines können besser sein. –

Antwort

3

A Catmull-Rom Spline verwendet, weil es eine Art Keil ist, der eine Kurve, in welcher für Sie Kontrollpunkte und verfeinern die Kurve selbst hinzufügen können (das ist, was Sie auf Photoshop tun, wenn Sie einen neuen hinzufügen klicken, um Punkt), mit der Besonderheit, dass die Kurve an jedem von Ihnen festgelegten Kontrollpunkt vorbeiführt.

In jedem Fall brauchen Sie nur eine Funktion, die einen Wert (float in 0..1 oder int in 0..255 oder welchen Farbraum Sie haben) einen anderen Wert erzeugt.

float fun(float x) { 
    y = /* something */ 
    return y; 
} 

Dies kann natürlich mit jeder Art von Funktion erfolgen. Die grundlegendste ist die Standardeinstellung einer, die eine Identitätsfunktion ist

float fun(float x) { 
    y = x; 
    return y; 
} 

Jede andere Funktion kann mit Kurven berechnet werden, und es wird in Ordnung, aber komplexer zu entwickeln, würde ich Sie vorschlagen, um von einfachen Beispielen zu beginnen wie eine Bezier-Kurve. In jedem Fall wird der Parameter t verwendet, da es sich um parametrische Kurven handelt. Sie müssen den mathematischen Hintergrund der Kurven verstehen, bevor Sie in die Entwicklung gehen. Schauen Sie sich here an.

+3

Photoshop verwendet keinen Catmull-Rom-Spline. Diese Splines sind lokal: Wenn Sie die Punkte A-B-C-D-E-F-G haben und den Punkt B herum bewegen, ändert sich die Kurve zwischen E-F nicht. In Photoshop-Kurven ändert sich bei Änderung eines Segments die gesamte Kurve. (Google sagt, dass PS Bikubic Splines verwendet, aber ich habe das nicht bestätigt.) –

+0

Ich denke, Glenn hat recht und es ist kein Catmump-Rom-Spline. Hier ist ein Link zu einem Code, der das gleiche zu implementieren scheint: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=68577&lngWId=-1 – joshcartme

+0

@Jack aber diese Kurve funktioniert als ob wir senken es erhöhen cyan und wenn wir es ziehen rot erhöhen, können wir beide gleichzeitig behandeln – AHF

0

Ich bin nicht vertraut mit CR, aber wenn es wie Beziers, als der T-Parameter variiert von 0 an einem Endpunkt eines Kurvenabschnitts zu einem am anderen Endpunkt . Es ist, wie Sie die Kurve "schreiten". Sie können also nicht einfach einen X-Wert eingeben. Sie können entweder ein langes beliebiges Intervall abtasten oder Sie können einen Algorithmus zur Zielsuche verwenden, um einen bestimmten x-Wert mit der für Sie notwendigen Genauigkeit zu erreichen.

+0

Ich würde mehr wie Spline als Bezier sagen, wie die Linie durch die Kontrollpunkte verläuft. – ysap

+0

Die tatsächliche Kurve kann in einigen Fällen die gleiche sein, aber Sie haben Recht, die Kontrollpunkte sind unterschiedlich. Wenn Sie die Kurve an den Kontrollpunkten festhalten möchten, verwenden Sie einen Spline. – comingstorm

7
+0

Funktioniert wirklich gut für mich. Seien Sie vorsichtig, wenn Sie die Seite mit Chrome übersetzen lassen, wird der Code aufgebläht. Kopieren Sie den Code also noch in Französisch und übersetzen Sie ihn dann, wenn Sie die Erklärung lesen möchten. Nahm mich für immer, um herauszufinden, warum der Code durcheinander war. –

+0

Aber wenn es uns die Grafik zeigt und wir sie für unser Ergebnis anpassen, wie können wir die Werte erhalten, auf die wir die Grafik anpassen? Wenn wir diese Kurve beim nächsten Mal nicht sehen wollen, wollen wir nur die Werte eingeben, die wir vorher getestet haben. – AHF

+0

Also sind diese kubischen Splines, oder nicht? Und wenn ja, welcher? Natürliche kubische Splines? –