2 votes

Comment utiliser une barre de défilement pour mettre à l'échelle un graphique ou une image de manière fluide ?

Je veux utiliser un contrôle de barre de défilement ou de barre de suivi dans mon application qui permet à mes utilisateurs de mettre à l'échelle les valeurs de l'axe des y dans un graphique.

Par exemple, le graphique est peut-être une onde sinusoïdale avec un pic de 1,0. En faisant glisser la barre de défilement, l'utilisateur devrait pouvoir augmenter la valeur du pic à 2,0, 200, ou la diminuer à 0,5, etc.

Je veux donc utiliser la position de la barre de défilement pour créer un facteur de multiplication que j'applique à chaque point y de ma courbe.

Je n'arrive pas à comprendre le calcul. Je crains que le fonctionnement de la commande ne soit pas fluide ou intuitif pour l'utilisateur. Il y a quelque chose qui implique des exponentielles ou des logs ici, n'est-ce pas ? Le milieu de la barre de défilement ne devrait-il pas être étiqueté 1,0, les valeurs supérieures augmentant (en espacement logarithmique) et les valeurs inférieures à 1,0 diminuant ?

Je me souviens du zéro de mon expérience en mathématiques log/exponentiel il y a presque quatre décennies.

Mon langage est Delphi, mais des fragments de code en pseudo-code seraient utiles.

TIA

PS N'hésitez pas à ajouter des balises supplémentaires à cette question pour qu'elle soit vue par le public le plus approprié...

5voto

David Heffernan Points 292687

Je pense que vous avez déjà répondu à la plupart des questions. Vous savez que vous voulez utiliser une échelle logarithmique. Vous aurez donc des coches, espacées de manière égale, 0,01, 0,1, 1,0, 10,0, 100,0, par exemple.

Plutôt qu'une barre de défilement, vous devriez utiliser une barre de suivi. Les valeurs de la barre de suivi sont en échelle logarithmique. Vous voulez donc quelque chose comme 0 pour correspondre à 0,01, 100 pour correspondre à 0,1, 200 pour correspondre à 1,0 et ainsi de suite. Cela vous donne une barre de progression avec un minimum de 0, un maximum de 400 et une position initiale de 200, c'est-à-dire 1,0.

Il reste maintenant à établir la correspondance entre la position de la barre d'accouplement et l'échelle. Il vous faut Scale(0) pour être égal à 0,01, Scale(100) pour être égal à 0,1 et ainsi de suite. Pour ce faire, vous utilisez l'exponentiation à la puissance 10.

function Scale(const Position: Integer): Double;
var
  Exponent: Double;
begin
  Exponent := (Position-200)/100.0;
  Result := Power(10.0, Exponent);
end;

Dans l'autre sens, il faut prendre des logarithmes et les réarranger.

function Position(const Scale: Double): Integer;
begin
  Result := Round(100.0*Log10(Scale)) + 200;
end;

Naturellement, si les chiffres et les valeurs min/max que j'ai sélectionnés ne vous conviennent pas, vous pouvez facilement les modifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X