2010-04-20 7 views
13

I ont une plage de valeurs de 0 à 255.Méthode C# pour mettre à l'échelle les valeurs?

Il y a une méthode qui retourne un tableau avec une valeurs min et max dans cette plage, à savoir: 13, 15, 20, 27, 50 ... 240 où 13 est le min et 240 est le max

Je dois mettre à l'échelle ces valeurs de sorte que 13 devient 0 et 240 devient 255 et mettre à l'échelle toutes les autres valeurs entre eux proportionnellement.

Y at-il une méthode C# qui fait cela?

merci!

+1

Sommes-nous supposer que vous êtes loo roi pour obtenir une gamme de flotteurs? –

+0

oui, j'ai oublié de mentionner que ... La méthode recevrait ce tableau et retournerait un nouveau à l'échelle. –

Répondre

18

Utilisez cette formule

y=mx+c 

m = (255-0)/(244-13) et c= -13*m

donc vous devez transformer tout le tableau en tant que tels

public double[] GetScaling(double[] arr, double min, double max) 
{ 
    double m = (max-min)/(arr.Max()-arr.Min()); 
    double c = min-arr.Min()*m; 
    var newarr=new double[arr.Length]; 
    for(int i=0; i< newarr.Length; i++) 
     newarr[i]=m*arr[i]+c; 
    return newarr; 
} 
+2

Au lieu de spécifier 244 et 13, vous devriez vraiment récupérer les min et max réels du tableau spécifié. –

+0

@ccomet, cela devrait être trivial – Graviton

+0

@ccomet, mettre à jour pour rendre le segment de code plus général. – Graviton

4

Si vous utilisez .NET 3.5, puis LINQ peut facilement obtenir les valeurs minimum et maximum à partir de n'importe quel objet IEnumerable<T>, qui est un tableau.

int[] values = new int[] { 0, 1, 2, ... 255 }; 

int minValue = values.Min(); 
int maxValue = values.Max(); 

Si vous cherchez quelque chose à l'échelle du réseau entier ...

public static int[] Scale(int[] values, int scaledMin, int scaledMax) 
{ 
    int minValue = values.Min(); 
    int maxValue = values.Max(); 

    float scale = (float)(scaledMax - scaledMin)/(float)(maxValue - minValue); 
    float offset = minValue * scale - scaledMin; 

    int[] output = new int[values.Length]; 

    for (int i = 0; i < values.Length; i++) 
    { 
     output[i] = (int)Math.Round(values[i] * scale - offset, 0); 
    } 

    return output; 
} 
+0

Il connaît le max et le min. Il veut transformer les valeurs du milieu pour qu'elles deviennent de 0 à 255. –

+0

@Daniel: c'est une bonne habitude de construire des méthodes réutilisables, qu'il connaisse les valeurs ou non. – fearofawhackplanet

+0

@fearofawhackplanet: Mon commentaire était seulement applicable pour une première version de la question, qui vient de dire comment vous pouvez trouver le maximum et le minimum, et rien sur la mise à l'échelle. Fait intéressant, cette version n'a existé que dans mes rêves: http://stackoverflow.com/posts/2675221/revisions –

4

à l'échelle valeur dans une plage (minScale, maxScale)

private double Scale(int value , int min, int max, int minScale, int maxScale) 
{ 
    double scaled = minScale + (double)(value - min)/(max-min) * (maxScale - minScale); 
    return scaled; 
} 

Pour trouver min et max du tableau entrant

var min = Array.Min(); 
var max = Array.Max(); 
Questions connexes