Поскольку я писал что-то похожее снова и снова, я сначала написал класс, содержащий функции, такие как:
/// <summary>
/// Calculate the position, of a given value, within a certain range/size
/// depending on the minimum and maximum (scale) for the value.
/// </summary>
/// <param name="data">Value for which to calculate the position.</param>
/// <param name="minimum_value">Minimum value of the scale on which the value must lie.</param>
/// <param name="maximum_value">Maximum value of the scale on which the value must lie.</param>
/// <param name="size_begin">The begin value of the size on which the scale must be spread.</param>
/// <param name="size_end">The end value of the size on which the scale must be spread.</param>
/// <returns>The respectively positions of the data value.</returns>
static public double Position_In_Size(double data, double minimum_value, double maximum_value, double size_begin, double size_end)
{
return size_begin + (((size_end - size_begin) / (maximum_value - minimum_value)) * (data - minimum_value));
}
Это быстро стало действительно большим классом для поддержки всех типов типов.C # не поддерживает обобщений для типов значений из коробки.
Недавно я нашел библиотеку, которая реализует обобщения в .NET с обходным путем.
Используя эту библиотеку, у меня теперь более чистая реализация,Используя универсальный интервальный класс, я могу отображать значения из одного диапазона в другой независимо от типа.
// Result will be 0.
Interval<int> interval = new Interval<int>( 0, 10 );
double result = interval.Map<double>( 5, new Interval<double>( -100, 100 ) );
Я написал это как часть некоторых классов интерполяции, над которыми я работал: http://whathecode.wordpress.com/2011/01/24/interpolation-no-more/
Исходный код можно найти в моей библиотеке расширений FCL , в пространстве имен Whathecode.System.Arithmetic.Range .