using UnityEngine;
namespace RR.Common.Utility
{
public static class MathUtils
{
///
/// Линейно переносит значение из диапазона [fromMin, fromMax] в диапазон [toMin, toMax].
///
/// Исходное значение
/// Минимум исходного диапазона
/// Максимум исходного диапазона
/// Минимум целевого диапазона
/// Максимум целевого диапазона
/// Преобразованное значение
public static float Remap(float value, float fromMin, float fromMax, float toMin, float toMax)
{
// Нормализуем значение в диапазон [0, 1]
float t = (value - fromMin) / (fromMax - fromMin);
// Переносим в целевой диапазон
return Mathf.Lerp(toMin, toMax, t);
}
///
/// Линейно переносит значение из диапазона [from] в диапазон [to].
///
/// Исходное значение
/// Исходный диапазон (x - минимум, y - максимум)
/// Целевой диапазон (x - минимум, y - максимум)
/// Преобразованное значение
public static float Remap(float value, Vector2 from, Vector2 to)
{
float t = (value - from.x) / (from.y - from.x);
return Mathf.Lerp(to.x, to.y, t);
}
///
/// Линейно переносит значение из диапазона [fromMin, fromMax] в диапазон [toMin, toMax].
///
/// Исходное значение
/// Минимум исходного диапазона
/// Максимум исходного диапазона
/// Минимум целевого диапазона
/// Максимум целевого диапазона
/// Преобразованное значение (округленное)
public static int Remap(int value, int fromMin, int fromMax, int toMin, int toMax)
{
float t = (float)(value - fromMin) / (fromMax - fromMin);
return Mathf.RoundToInt(Mathf.Lerp(toMin, toMax, t));
}
///
/// Линейно переносит значение из диапазона [from] в диапазон [to].
///
/// Исходное значение
/// Исходный диапазон (x - минимум, y - максимум)
/// Целевой диапазон (x - минимум, y - максимум)
/// Преобразованное значение (округленное)
public static int Remap(int value, Vector2Int from, Vector2Int to)
{
float t = (float)(value - from.x) / (from.y - from.x);
return Mathf.RoundToInt(Mathf.Lerp(to.x, to.y, t));
}
///
/// Линейно переносит значение из диапазона [fromMin, fromMax] в диапазон [toMin, toMax].
///
/// Исходное значение
/// Минимум исходного диапазона
/// Максимум исходного диапазона
/// Минимум целевого диапазона
/// Максимум целевого диапазона
/// Преобразованное значение
public static double Remap(double value, double fromMin, double fromMax, double toMin, double toMax)
{
double t = (value - fromMin) / (fromMax - fromMin);
return toMin + (toMax - toMin) * t;
}
///
/// Линейно переносит значение из диапазона [from] в диапазон [to].
///
/// Исходное значение
/// Исходный диапазон (x - минимум, y - максимум)
/// Целевой диапазон (x - минимум, y - максимум)
/// Преобразованное значение
public static double Remap(double value, Vector2 from, Vector2 to)
{
double t = (value - from.x) / (from.y - from.x);
return to.x + (to.y - to.x) * t;
}
}
}