Как отобразить значение между (обозначение интервала) [a, b] в [a, x] U [y, b] - PullRequest
0 голосов
/ 27 сентября 2019

Я хочу определить интервал [a, b] и интервал [x, y], где: a Бонусные баллы, если кто-то может помочь мне выяснить версию этого, которая позволяет отображать значение v в интервале с любым числом диапазонов, чтобы исключитьЗначение, отображающее значение v из интервала [a, b] в интервал [a, x1] U [y1, x2] U [y2, x3] U [y3, x4] ... ... U [yn, b]

Большинство проблем, с которыми я сталкивался, заключается в том, что если значение отображается ниже / выше исключенной области, перемещение самой дальней точки исключаемой области, похоже, не влияет на ответ.

То есть, если я хочу отобразить значение от 0 до 1 и диапазон исключения составляет от 0,25 до 0,75, ответ будет таким же, как если бы диапазон исключения был от 0,25 до 0,5 (но ответ не долженбыть таким же, как exclude.y подходы exclude.x влияние этой функции навход должен быть уменьшен.(Поскольку, гипотетически, диапазон исключения от [произвольное_значение] до [одно и то же_арбитальное_значение] не должен влиять на ввод вообще; он должен быть таким же, как простой Lerp между a и b с t.

I "понимаю«разница между Lerp и InverseLerp, но так как мне не нужно было использовать InverseLerp раньше (и я достаточно озадачен, что я до сих пор не уверен, что мне это нужно), вполне вероятно, что я получил их назад в своей головеили если я подхожу к схеме ввода значений в саму функцию неправильно, но я не уверен.

public static float MapValue(float a, float b, float t, /*params */Vector2/*[]*/ exclude)
{
    if (b == a)
    {
        return a;
    }
    else if (a > b)
    {
        float tmp = b;
        b = a;
        a = tmp;
        Debug.LogWarning("Hey, MapValue() recieved values such that b < a. Make sure a is always less than b. Due to this, the values were swapped. Keep in mind this could cause unexpected behaviour.");
    }
    if (exclude.x == exclude.y)
    {
        return Mathf.Lerp(a, b, t);
    }
    else if (exclude.x > exclude.y)
    {
        float tmp = exclude.y;
        exclude.y = exclude.x;
        exclude.x = tmp;
        Debug.LogWarning("Hey, MapValue() recieved values such that exclude.y < exclude.x. Make sure exclude.x is always less than exclude.y. Due to this, the values were swapped. Keep in mind this could cause unexpected behaviour.");
    }        
    if (exclude.y == b)
    {
        if (exclude.x == a)
        {
            return float.NaN;
        }
        return Mathf.Lerp(a, exclude.x, t);
    }
    else if (exclude.x == a)
    {
        return Mathf.Lerp(exclude.y, b, t);
    }
    //float buff = (exclude.y - exclude.x) / 2f;
    //float avg = (exclude.x + exclude.y) / 2f;
    //float split = Mathf.InverseLerp(a + buff, b - buff, Mathf.Lerp(a + buff, b - buff, (exclude.x + exclude.y) / 2f));
    //float split = Mathf.Lerp(a + buff, b - buff, (exclude.x + exclude.y) / 2f);
    float split = (exclude.x + exclude.y + a + b) / 4f;
    if (t < split)
    {
        return Mathf.Lerp(a, exclude.x, t);
    }
    else if (t > split)
    {
        return Mathf.Lerp(exclude.y, b, t);
    }
    else
    {
        return (Random.Range(0, 2) == 1) ? exclude.x : exclude.y;
    }
}

Проверка ошибок / "исправление ввода" / ответы на ярлыки работают нормально, но основные вычисления кажутся неверными.

Кстати, для тех, кто не знаком с вещами из библиотеки Unity, использованными в моем коде, Vector2 - это просто структура с x (float) и y (значения с плавающей точкой. Lerp (a, b, t) - это просто линейная интерполяция, где Lerp (a, b, 1) возвращает b, Lerp (a, b, 0) возвращает a, а Lerp (a, b, 0.5f)возвращает ((a + b)/ 2f).InverseLerp в основном то, что звучит;вместо того, чтобы принимать значение, вы даете ему значение в интервале, и оно возвращает интерполированное значение, зафиксированное в (a, b).

...