Математические функции от Warden

Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Алгоритм
// Полярное смещение

function PolarOffset takes location loc, real dist, real angle returns location
    local real x = GetLocationX(loc) + dist * Cos(angle * bj_DEGTORAD)
    local real y = GetLocationY(loc) + dist * Sin(angle * bj_DEGTORAD)
    call MoveLocation(loc, x, y)
    return loc
endfunction

// Возвращает : Расстояние между двумя объектами (юнит, предмет, декорация = widget)

function DistanceBetweenWidgets takes widget widgetA, widget widgetB returns real
    local real dx = GetWidgetX(widgetB) - GetWidgetX(widgetA)
    local real dy = GetWidgetY(widgetB) - GetWidgetY(widgetA)
    return SquareRoot(dx * dx + dy * dy)
endfunction

// Возвращает : Угол между двумя объектами

function AngleBetweenWidgets takes widget widgetA, widget widgetB returns real
    return bj_RADTODEG * Atan2(GetWidgetY(widgetB) - GetWidgetY(widgetA), GetWidgetX(widgetB) - GetWidgetX(widgetA))
endfunction

// Возвращает : Расстояние между двумя углами

function GetAngleDifference takes real a1, real a2 returns real
    local real x
    set a1 = ModuloReal(a1, 360)
    set a2 = ModuloReal(a2, 360)
    if (a1 > a2) then
        set x = a1
        set a1 = a2
        set a2 = x
    endif
    set x = a2 - 360
    if (a2 - a1 > a1 - x) then
        set a2 = x
    endif
    return RAbsBJ(a1 - a2)
endfunction

// Возвращает : Возвращает угол в центре двух углов

function GetMidAngle takes real a1, real a2 returns real
    local real x
    set a1 = ModuloReal(a1, 360)
    set a2 = ModuloReal(a2, 360)
    if (a1 > a2) then
        set x = a1
        set a1 = a2
        set a2 = x
    endif
    set x = a2 - 360
    if (a2 -a1 > a1-x) then
        set a2 = x
    endif
    return (a1 + a2) / 2
endfunction

// Возвращает true : Если угол находится между двумя углами

function IsAngleBetweenAngles takes real angle, real angle1, real angle2 returns boolean
    local real x
    set angle = ModuloReal(angle, 360)
    set angle1 = ModuloReal(angle1, 360)
    set angle2 = ModuloReal(angle2, 360)
    if (angle1 > angle2) then
        set x = angle1
        set angle1 = angle2
        set angle2 = x
    endif
    if (angle2 - angle1) > (angle1 - (angle2-360)) then
        set angle2 = angle2 - 360
        if angle > 180 then
            set angle = angle-360
        endif
        return angle >= angle2 and angle <= angle1
    endif
    return (angle >= angle1) and (angle <= angle2)
endfunction
0
17
12 лет назад
0
Эти функции работают быстрее стандартных?!
0
8
12 лет назад
0
Arti, полярное смещение да, а вот Angle тоже самое только тут не локационы а объекты(юнит или декор) остального нету в BJ
мне пригодилось только функция GetMidAngle =_=
Этот комментарий удален
0
11
10 лет назад
0
А что значит "Расстояние между двумя углами" ? Как это?
1
29
10 лет назад
1
Farrien, минимальный угол на который требуется повернуться, чтобы перейти из угла A1 в угол A2.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.