Уравнение синусоидальной волны для дополнения World of Warcraft
Я создаю дополнение для World of Warcraft.
У меня есть это:
if edirection == "moon" then sffem = 105*math.sin(math.pi - math.asin(cpower/105) + math.pi/20 * sfcasttime) end
Это работает нормально, но мне нужно поставить точки среза на 100 и -100.
Это потому, что энергия моего персонажа основана на синусоиде, начинающейся с 0, которая падает до -100, остается там в течение нескольких секунд, возвращается к 0, поднимается до 100, остается в течение нескольких секунд и возвращается к 0.
Это работает, потому что синусоида рассчитана на 105, -105 энергии, но максимальная и минимальная энергия игрока равна 100.
Я старался:
if edirection == "moon" then sffem = (MAX(-100;MIN(100;105*math.sin(math.pi - math.asin(cpower/105) + math.pi/20 * sfcasttime)))) end
Это просто дает ошибку.
Как я могу это сделать?
2 ответа
Там нет необходимости делать все это в одной строке. Например, после строки
if edirection == "moon" then sffem = 105*math.sin(math.pi - math.asin(cpower/105) + math.pi/20 * sfcasttime) end
сделать что-то вроде
if sffem >= 100 then sffem = 100 end
if sffem <= -100 then sffem = -100 end
(Спасибо Хенрику Ильгену за помощь в синтаксисе)
Ваша вторая строка кода использует точки с запятой вместо запятых для разделения аргументов MAX
а также MIN
,
Ваш код после этого изменения и использования math.min
а также math.max
:
if edirection == "moon" then sffem = math.max(-100,math.min(100,105*math.sin(math.pi - math.asin(cpower/105) + math.pi/20 * sfcasttime))) end
Вы можете найти полезным сделать вспомогательную функцию зажима:
function clamp(value, min, max)
return math.max(min, math.min(max, value))
end
В этом случае ваш код становится следующим:
if edirection == "moon" then sffem = clamp(105*math.sin(math.pi - math.asin(cpower/105) + math.pi/20 * sfcasttime), -100, 100) end