Уравнение синусоидальной волны для дополнения 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
Другие вопросы по тегам