Элегантный способ проверить, находится ли число в диапазоне кругового набора по модулю? - PullRequest
1 голос
/ 12 октября 2019

Мой математический словарь действительно шаткий, но я точно знаю, что искал, поэтому, пожалуйста, прости название.

Скажем, у меня есть круговой набор чисел от 0,00 до 0,99. Это означает, что число возвращается к 0, когда оно равно 1. Так что 1 действительно равно 0 (или 1 % 1) и 1.1 действительно равно 0.1 (или 1.1 % 1).

Теперь, учитывая число в этом наборе (setPoint) и число, представляющее половину длины диапазона (halfRangeLength), я хочу посмотреть, находится ли число (number) в этом диапазоне илинет.

const isInSetRange = (setPoint, halfRangeLength, number) => {
    // Returns => boolean ... number is between min (inclusive) and max (exclusive)

    return (number >= setPoint - halfRangeLength) && (number < setPoint + halfRangeLength)
}

Так, например:

isInSetRange(0.5, 0.1, 0.45) 
// => true, 0.45 is between 0.4 and 0.6

Теперь вот в чем проблема.

Как мне добиться следующего результата на краях моего набора номеров?

isInSetRange(0, 0.1, 0.95) 
// => true, 0.95 is between 0.9 and 0.1

и

isInSetRange(0.9, 0.2, 0) 
// => true, 0 is between 0.7 and 0.1

Мне действительно не хватаетматематический фон, чтобы попасть в это. Если кто-то может помочь на любом языке программирования, который использует общую библиотеку Math с javascript, я был бы очень признателен.

Спасибо!

1 Ответ

2 голосов
/ 12 октября 2019

Просто сдвиньте setPoint и значение в функции, если halfRangeLength приведет к тому, что значение low / high выйдет за пределы диапазона 0 ... 1

Кажется, работает для данных примера

const isInSetRange = (setPoint, halfRangeLength, number) => {
    let low = setPoint - halfRangeLength;
    let high = setPoint + halfRangeLength - 1;
    if (low < 0) {
      setPoint -= low;
      number = (number - low) % 1;
    } else if (high > 0) {
      setPoint -= high;
      number = (1 + number - high) % 1;
    }
    return (number >= setPoint - halfRangeLength) && (number < setPoint + halfRangeLength)
}



console.log(isInSetRange(0.5, 0.1, 0.45))
console.log(isInSetRange(0, 0.1, 0.95))
console.log(isInSetRange(0.9, 0.2, 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...