Frage

Zur Zeit habe ich eine Kontrolle, zu der ich brauche die Anlage hinzufügen verschiedene Schärfen (oder Empfindlichkeit) anzuwenden. Das Problem lässt sich am besten als ein Bild dargestellt:

Graph http://img87.imageshack.us/img87/7886/control. png

Wie Sie sehen können, ich habe X und Y Axess, die beide haben willkürliche Grenzen von 100 -, die für diese Erklärung sollte ausreichen. Derzeit ist meine Kontrolle die rote Linie (lineares Verhalten), aber ich möchte die Möglichkeit, für die anderen drei Kurven hinzuzufügen (oder mehr), dh, wenn eine Kontrolle empfindlicher ist, dann wird eine Einstellung der linearen Einstellung ignorieren und gehen für ein die drei Linien. Der Startpunkt wird immer 0 sein, und der Endpunkt wird immer 100 sein.

Ich weiß, dass ein exponentielles zu steil ist, aber kann nicht scheinen, einen Weg nach vorne Figur. Irgendwelche Vorschläge bitte?

War es hilfreich?

Lösung

Die Kurven Sie sehen aus wie Gammakorrektur Kurven. Die Idee ist, dass das Minimum und Maximum des Bereichs der gleiche wie der Eingang bleibt, aber die Mitte gebogen ist, wie Sie in Ihrem Graphen (was ich haben könnte zu beachten ist nicht der Kreisbogen was würden Sie erhalten von der Cosinus-Implementierung).

Grafisch sieht es wie folgt aus:


(Quelle: wikimedia.org )

Also, mit, dass als Inspiration, hier ist die Mathematik ...

Wenn x Werte von 0 bis 1 reichten, die Funktion ist einfach:

y = f(x, gamma) = x ^ gamma

Fügen Sie einen xmax Wert für die Skalierung (das heißt x = 0 bis 100), und die Funktion wird:

y = f(x, gamma) = ((x / xmax) ^ gamma) * xmax

oder alternativ:

y = f(x, gamma) = (x ^ gamma) / (xmax ^ (gamma - 1))

Sie können nehmen einen Schritt weiter, wenn Sie einen Nicht-Null xmin hinzufügen möchten.

Wenn gamma 1 ist, ist die Linie immer perfekt linear (y = x). Wenn x kleiner als 1 ist, Ihre Kurve nach oben biegt. Wenn x größer als 1 ist, Ihre Kurve biegt nach unten. Der Kehrwert von Gamma den Wert wieder auf den ursprünglichen (x = f (y konvertieren, 1 / g) = f (f (x, g), 1 / g).

Sie einfach den Wert von Gamma anpassen nach Ihren eigenen Geschmack und Anwendungsanforderungen. Da Sie wollen dem Benutzer mehrere Optionen für die „Empfindlichkeitsverbesserung“ geben, können Sie Ihre Benutzer Entscheidungen auf einer linearen Skala geben, sagen im Bereich von -4 (am wenigsten empfindlich) auf 0 (keine Veränderung) bis 4 (empfindlichste ), und die internen Gamma-Wert mit einer Potenzfunktion skalieren. Mit anderen Worten, der Benutzer-Auswahl von den, (-4, -3, -2, -1, 0, 1, 2, 3, 4), aber zu übersetzen, das zu Gamma-Werten von (5,06, 3,38, 2,25, 1,50, 1,00 , 0,67, 0,44, 0,30, 0,20).

Codierung, dass in C # könnte wie folgt aussehen:

public class SensitivityAdjuster {
    public SensitivityAdjuster() { }
    public SensitivityAdjuster(int level) {
        SetSensitivityLevel(level);
    }
    private double _Gamma = 1.0;
    public void SetSensitivityLevel(int level) {
        _Gamma = Math.Pow(1.5, level);
    }
    public double Adjust(double x) {
        return (Math.Pow((x / 100), _Gamma) * 100);
    }
}

Um es zu verwenden, erstellen Sie einen neuen SensitivityAdjuster, stellen Sie die Empfindlichkeit entsprechend den Benutzerpräferenzen (entweder den Konstruktor oder unter Verwendung des Verfahrens und -4 bis 4 wäre wahrscheinlich vernünftiges Niveau Werte) und rufen einstellen (x) die bekommen eingestellten Ausgangswert. Wenn Sie einen breiteren oder schmalere Bereich von einem vernünftigen Niveau wollen, würden Sie, dass die 1,5-Wert im SetSensitivityLevels Verfahren verringern oder erhöhen. Und natürlich die 100 stellt maximalen x-Wert.

Andere Tipps

Ich schlage vor, eine einfache Formel, dass (ich glaube) erfasst Ihre Anforderung. Um einen vollständigen „Viertelkreis“ zu haben, die Ihr Extremfall ist, würden Sie (1-cos((x*pi)/(2*100)))*100 verwenden.

Was ich vorschlagen, ist, dass man einen gewichteten Mittelwert zwischen y = x und y = nehmen (1-cos ((x * pi) / (2 * 100))) * 100. Zum Beispiel hat sehr nahe linear (99% linear), nehmen Sie:

y = 0.99*x + 0.01*[(1-cos((x*pi)/(2*100)))*100]

oder allgemeiner sagt die Höhe der Linearität L ist, und es ist in dem Intervall [0, 1], Ihre Formel lautet:

y = L*x + (1-L)*[(1-cos((x*pi)/(2*100)))*100]

EDIT: Ich änderte cos(x/100) cos((x*pi)/(2*100)), weil für die cos im Bereich sein Ergebnis [1,0] X im Bereich von [0, pi / 2] und nicht [0,1], sorry sein sollte der anfängliche Fehler.

Sie sind wahrscheinlich der Suche nach so etwas wie Polynom-Interpolation . Eine quadratische / kubische / quartic Interpolation sollten Sie die Arten von Kurven, um Ihnen in der Frage zeigen. Die Unterschiede zwischen den drei Kurven, die Sie wahrscheinlich nur erreicht zeigen könnten, werden durch die Koeffizienten eingestellt (die indirekt Steilheit bestimmen).

Der Graph von y = x^p für x von 0 auf 1 wird tun, was Sie wollen, wie Sie nach oben (der roten Linie geben, die) variieren p von 1. Wie p erhöht die Kurve mehr und mehr ‚eingeschoben‘ werden. p muss nicht eine ganze Zahl sein.

(Sie werden skalieren müssen 0 bis 100 zu erhalten, aber ich bin sicher, dass aus der Arbeit)

Ich stimme für Rax Olgud die allgemeine Idee, mit einer Änderung:

y = alpha * x + (1-alpha)*(f(x/100)*100)

alt text http://www4c.wolframalpha.com / berechnen / MSP / MSP4501967d41e1aga1b3i00004bdeci2b6be2a59b? MSPStoreType = image / gif & s = 6

wobei f (0) = 0, f (1) = 1, f (x) ist superlinear, aber ich weiß nicht, wo diese "Viertelkreis" Idee kam oder warum 1-cos (x) wäre eine gute Wahl.

würde ich vorschlagen, f (x) = x k mit k = 2, 3, 4, 5, was auch immer Ihnen die gewünschten degre der Steilheit für & alpha = 0 einen Wert für k Auswahl gibt als eine feste Zahl, variiert α, um dann Ihre spezielle Kurve zu wählen.

Für Probleme wie diese, ich werde oft ein paar Punkte aus einer Kurve bekommen und es durch ein Kurvenanpassungsprogramm werfen. Es gibt eine Reihe von ihnen gibt. Hier ist eine mit einer 7-Tage-Testversion.

Ich habe eine Menge, indem Sie versuchen verschiedene Modelle gelernt. Oft kann man einen ziemlich einfacher Ausdruck Ihre Kurve zu kommen nahe kommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top