94 lines
5.3 KiB
C#

using UnityEngine;
namespace RR.Common.Utility
{
public static class MathUtils
{
/// <summary>
/// Линейно переносит значение из диапазона [fromMin, fromMax] в диапазон [toMin, toMax].
/// </summary>
/// <param name="value">Исходное значение</param>
/// <param name="fromMin">Минимум исходного диапазона</param>
/// <param name="fromMax">Максимум исходного диапазона</param>
/// <param name="toMin">Минимум целевого диапазона</param>
/// <param name="toMax">Максимум целевого диапазона</param>
/// <returns>Преобразованное значение</returns>
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);
}
/// <summary>
/// Линейно переносит значение из диапазона [from] в диапазон [to].
/// </summary>
/// <param name="value">Исходное значение</param>
/// <param name="from">Исходный диапазон (x - минимум, y - максимум)</param>
/// <param name="to">Целевой диапазон (x - минимум, y - максимум)</param>
/// <returns>Преобразованное значение</returns>
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);
}
/// <summary>
/// Линейно переносит значение из диапазона [fromMin, fromMax] в диапазон [toMin, toMax].
/// </summary>
/// <param name="value">Исходное значение</param>
/// <param name="fromMin">Минимум исходного диапазона</param>
/// <param name="fromMax">Максимум исходного диапазона</param>
/// <param name="toMin">Минимум целевого диапазона</param>
/// <param name="toMax">Максимум целевого диапазона</param>
/// <returns>Преобразованное значение (округленное)</returns>
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));
}
/// <summary>
/// Линейно переносит значение из диапазона [from] в диапазон [to].
/// </summary>
/// <param name="value">Исходное значение</param>
/// <param name="from">Исходный диапазон (x - минимум, y - максимум)</param>
/// <param name="to">Целевой диапазон (x - минимум, y - максимум)</param>
/// <returns>Преобразованное значение (округленное)</returns>
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));
}
/// <summary>
/// Линейно переносит значение из диапазона [fromMin, fromMax] в диапазон [toMin, toMax].
/// </summary>
/// <param name="value">Исходное значение</param>
/// <param name="fromMin">Минимум исходного диапазона</param>
/// <param name="fromMax">Максимум исходного диапазона</param>
/// <param name="toMin">Минимум целевого диапазона</param>
/// <param name="toMax">Максимум целевого диапазона</param>
/// <returns>Преобразованное значение</returns>
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;
}
/// <summary>
/// Линейно переносит значение из диапазона [from] в диапазон [to].
/// </summary>
/// <param name="value">Исходное значение</param>
/// <param name="from">Исходный диапазон (x - минимум, y - максимум)</param>
/// <param name="to">Целевой диапазон (x - минимум, y - максимум)</param>
/// <returns>Преобразованное значение</returns>
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;
}
}
}