Question

À l’heure actuelle, j’ai un contrôle auquel je dois ajouter la possibilité d’appliquer diverses acuité (ou sensibilité). Le problème est mieux illustré par une image:

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

Comme vous pouvez le constater, j’ai les axes X et Y qui ont tous deux une limite arbitraire de 100 - cela devrait suffire à cette explication. À l’heure actuelle, mon contrôle correspond à la ligne rouge (comportement linéaire), mais j’aimerais ajouter la possibilité pour les 3 autres courbes (ou plus), c’est-à-dire si un contrôle est plus sensible, un paramètre ignore le paramètre linéaire et en choisit une. des trois lignes. Le point de départ sera toujours 0 et le point final sera toujours 100.

Je sais qu’une exponentielle est trop raide, mais je ne peux pas sembler avancer. Des suggestions s'il vous plaît?

Était-ce utile?

La solution

Les courbes que vous avez illustrées ressemblent beaucoup à des correction de gamma . L’idée est que le minimum et le maximum de la plage restent identiques à ceux de l’entrée, mais le milieu est plié comme vous l’avez dans vos graphiques (ce que je pourrais noter, c’est pas l’arc circulaire que obtenir de la mise en œuvre du cosinus).

Graphiquement, cela ressemble à ceci:

 alt text
(source: wikimedia.org )

Alors, avec cela comme inspiration, voici le calcul ...

Si vos valeurs x vont de 0 à 1, la fonction est plutôt simple:

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

Ajoutez une valeur xmax pour la mise à l’échelle (c.-à-d. x = 0 à 100) et la fonction devient:

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

ou alternativement:

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

Vous pouvez aller plus loin si vous souhaitez ajouter un xmin non nul.

Lorsque gamma est égal à 1, la ligne est toujours parfaitement linéaire (y = x). Si x est inférieur à 1, votre courbe se courbe vers le haut. Si x est supérieur à 1, votre courbe se courbe vers le bas. La valeur réciproque de gamma convertira la valeur en valeur originale (x = f (y, 1 / g) = f (f (x, g), 1 / g).

Adaptez simplement la valeur gamma en fonction de vos besoins et de vos besoins. Étant donné que vous souhaitez donner à l’utilisateur de multiples options pour «l’amélioration de la sensibilité», vous pouvez lui donner des choix sur une échelle linéaire, allant de -4 (le moins sensible) à 0 (aucun changement) à 4 (la plupart). sensible) et adaptez vos valeurs gamma internes à une fonction de puissance. En d’autres termes, donnez aux utilisateurs le choix de (-4, -3, -2, -1, 0, 1, 2, 3, 4), mais traduisez-le en valeurs gamma de (5.06, 3.38, 2.25, 1.50, 1.00 , 0,67, 0,44, 0,30, 0,20).

Coder cela en C # pourrait ressembler à quelque chose comme ceci:

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

Pour l'utiliser, créez un nouveau SensitivityAdjuster, définissez le niveau de sensibilité en fonction des préférences de l'utilisateur (à l'aide du constructeur ou de la méthode, et les valeurs -4 à 4 seraient probablement des valeurs de niveau raisonnables) et appelez Adjust (x) pour obtenir le résultat. valeur de sortie ajustée. Si vous souhaitez une plage de niveaux raisonnables plus large ou plus étroite, vous devez réduire ou augmenter cette valeur 1,5 dans la méthode SetSensitivityLevels. Et bien sûr, le 100 représente votre valeur x maximale.

Autres conseils

Je propose une formule simple, qui (je crois) capture votre besoin. Pour avoir un "quart de cercle" complet, ce qui est votre cas extrême, utilisez (1-cos ((x * pi) / (2 * 100))) * 100 .

Je suggère que vous preniez une moyenne pondérée entre y = x et y = (1-cos ((x * pi) / (2 * 100))) * 100. Par exemple, pour avoir très proche de linéaire (99% linéaire), prenez:

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

Ou plus généralement, supposons que le niveau de linéarité soit égal à L et que, dans l'intervalle [0, 1], votre formule soit:

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

EDIT: j'ai remplacé cos (x / 100) par cos ((x * pi) / (2 * 100)) , car pour que le résultat cos soit dans la plage [1,0] X devrait être dans la plage de [0, pi / 2] et non de [0,1], désolé pour l'erreur initiale.

Vous cherchez probablement quelque chose comme une une interpolation polynomiale . Une interpolation quadratique / cubique / quartique devrait vous donner le genre de courbes que vous montrez dans la question. Les différences entre les trois courbes que vous montrez pourraient probablement être obtenues simplement en ajustant les coefficients (qui déterminent indirectement la pente).

Le graphique de y = x ^ p pour x de 0 à 1 fera ce que vous voulez lorsque vous faites varier p de 1 ( qui donnera la ligne rouge) vers le haut. Lorsque p augmente, la courbe est de plus en plus poussée. p ne doit pas nécessairement être un entier.

(Vous devrez vous adapter pour obtenir de 0 à 100, mais je suis sûr que vous pouvez résoudre ce problème)

Je vote pour l'idée générale de Rax Olgud, avec une modification:

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

autre texte / Calculate / MSP / MSP4501967d41e1aga1b3i00004bdeci2b6be2a59b? MSPStoreType = image / gif & amp; s = 6

où f (0) = 0, f (1) = 1, f (x) est superlinéaire, mais je ne sais pas où ce "quart de cercle" idée est venue ou pourquoi 1-cos (x) serait un bon choix.

Je suggérerais f (x) = x k où k = 2, 3, 4, 5, tout ce qui vous donne le degré de pente souhaité pour & alpha = 0. Choisissez une valeur pour k en tant que nombre fixe, faites varier & # 945; choisir votre courbe particulière.

Pour des problèmes comme celui-ci, j’obtiens souvent quelques points d’une courbe et la passe dans un programme d’ajustement de courbe. Il y en a un tas là-bas. En voici un avec un essai gratuit de 7 jours.

J'ai beaucoup appris en essayant différents modèles. Vous pouvez souvent obtenir une expression assez simple pour vous rapprocher de votre courbe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top