Как обернуть значение между границами? - PullRequest
0 голосов
/ 26 февраля 2019

Как можно обернуть значение вокруг произвольных границ?Я хочу избежать проверок if, поэтому я пришел к этому, который работает для нижней границы, используя шаг:

float check = step(-1, val)*2.0-1.0;
val *= check;

Это выведет любое значение вектора val, когда оно больше -1, и обернуться вокруг, и перейти к 1., когда оно превышает его.

Моя цель состоит в том, чтобы, когда значение превышает определенный порог, оно «оборачивается» и начинается с противоположной стороны экрана.Таким образом, если движущаяся точка, например, превышает 1, она снова появится на экране в положении -1 и продолжит двигаться дальше.

С другой стороны, если значение меньше -1,он появится в позиции 1 и продолжит движение оттуда.

1 Ответ

0 голосов
/ 26 февраля 2019
float check = step(-1, val)*2.0-1.0;

Это будет эффективно выводить любое значение, которое вектор val имеет в своих компонентах всякий раз, когда это значение больше -1, и оборачиваться и переходить к 1, когда оно превышает его.

Нет.Результатом функции step() является eiterh 0.0 или 1.0, в любом случае.Таким образом, результат step(-1, val)*2.0-1.0 равен -1,0 или 1,0.


Моя цель состоит в том, чтобы, когда значение превышает определенный порог, оно «оборачивается» и начинается с противоположной стороны.экрана.Так, если движущаяся точка, например, превышает 1, она снова появится на экране в положении -1,

То, что вы хотите сделать, может быть достигнуто с помощью функции mod(x, y)https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mod.xhtml,, который возвращает остаток от деления x на y:

y = mod(x+1.0, 2.0)-1.0 

Независимо от значения x, результат функции всегда находится в диапазоне [-1,1].Если верхний предел 1 достигнут, сразу следующий результат равен -1:

Обратите внимание, функция использует mod()https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mod.xhtmlподдержка genType.Это означает, что x и y могут даже иметь тип vec2, vec3 или vec4.Конечно, x и y должны быть одного типа.

...