2010-04-20 2 views
13

У меня есть диапазон значений от 0 до 255.Метод C# для масштабирования значений?

Там это метод, который возвращает массив с минимальным и максимальным значениями в пределах этого диапазона, то есть: 13, 15, 20, 27, 50 ... 240 где 13 - минимальный, а 240 - максимальный

Мне нужно масштабировать эти значения так, чтобы 13 становилось 0, а 240 становилось 255 и масштабировало все остальные значения между ними пропорционально.

Есть ли какой-нибудь метод C#?

спасибо!

+1

Можно ли предположить, что вы «Хотите получить массив поплавков? –

+0

Да, я забыл упомянуть, что ... Метод получит этот массив и вернет новый масштаб. –

ответ

18

Используйте эту формулу

y=mx+c 

где m = (255-0)/(244-13) и c= -13*m

Таким образом, вы должны просто преобразовать массив в качестве такого

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

Вместо указания 244 и 13 вы должны действительно получить фактические значения min и max указанного массива. –

+0

@ccomet, это должно быть тривиально. – Graviton

+0

@ccomet, обновление, чтобы сделать сегмент кода более общим. – Graviton

4

Если вы используете .NET 3.5, то LINQ может легко получить минимальное и максимальное значения из любого объекта IEnumerable<T>, который является массивом.

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

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

Если вы ищете что-то масштабировать весь массив ...

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

Он знает максимум и минимум. Он хочет преобразовать значения в середине так, чтобы они становились от 0 до 255. –

+0

@ Даниэль: хорошая практика заключается в том, чтобы строить методы многократного использования независимо от того, знает ли он значения или нет. – fearofawhackplanet

+0

@fearofawhackplanet: Мой комментарий был только применим для первой версии вопроса, который только что сказал, как вы можете найти максимум и минимум, и ничего о масштабировании. Интересно, что эта версия существовала только в моих мечтах: http://stackoverflow.com/posts/2675221/revisions –

4

Для масштабирования значения в диапазоне (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; 
} 

Для поиска мин и макс. от входящего массива

var min = Array.Min(); 
var max = Array.Max(); 
Смежные вопросы