Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Zinc
Тип:
Наработка
Версия Warcraft:
1.26+

Набор функций для работы с полярными координатами.

MUI: да
Импорт: нет
Утечки: нет
Требования: JNGP

Установка

  • Скопировать триггер Polar

Описание функций

// Полярное смещение координат
function GetPolarOffsetX(real x, real distance, real angle) -> real
function GetPolarOffsetY(real y, real distance, real angle) -> real

// Полярное перемещение точки
function MoveLocationPolar(location target, real distance, real angle)

// Полярное перемещение юнита
function SetUnitPositionPolar(unit target, real distance, real angle)

// Вычисление угла
function AngleBetweenCoords(real x1, real y1, real x2, real y2) -> real
function AngleBetweenWidget(widget target1, widget target2) -> real

// Вычисление расстояния
DistanceBetweenCoords(real x1, real y1, real x2, real y2) -> real
DistanceBetweenCoords3D(real x1, real y1, real z1, real x2, real y2, real z2) -> real
DistanceBetweenWidgets

// Получение высоты почвы
function GetTerrainZ(real x, real y) -> real

// Получение высоты юнита
function GetUnitZ(unit target) -> real

// Изменение высоты юнита
function SetUnitZ(unit target, real z)

// Добавляем|убираем способность 'Amrf' - превратиться в ворона.
function UnitAddAbilityZ(unit target)
function UnitRemoveAbilityZ(unit target)

// Изменение координат юнита
function SetUnitXY(unit target, real x, real y) -> unit
function SetUnitXYZ(unit target, real x, real y, real z) -> unit
function SetUnitXYZF(unit target, real x, real y, real z, real f) -> unit

// https://xgm.guru/p/wc3/perpendicular
// Находит длину перпендикуляра от отрезка, заданного Xa, Ya, Xb, Yb к точке, заданной Xc, Yc.
function Perpendicular (real Xa, real Ya, real Xb, real Yb, real Xc, real Yc) -> real

// https://xgm.guru/p/wc3/warden-math
// Расстояние между двумя углами
function AngleDifference(real a1, real a2) -> real

/*
h - максимальная высота на середине расстояния
d - общее расстояние до цели
x - расстояние от исходной цели до точки
*/
function ParabolaZ(real h, real d, real x) -> real

/*
zs - начальная высота высота одного края дуги
ze - конечная высота высота другого края дуги
h  - максимальная высота на середине расстояния
d  - общее расстояние до цели
x  - расстояние от исходной цели до точки
*/
function ParabolaZ2(real zs, real ze, real h, real d, real x) -> real

// Приводит угол в божеский вид
function AngleNormalize(real angle) -> real

Техничеcкие подробности

Код библиотеки
//! zinc
library Polar {
    constant integer AbilityUnitZ = 'Amrf';
    location locationZ = Location(0, 0);
    
    public {
        function GetPolarOffsetX(real x, real distance, real angle) -> real {
            return x + distance * Cos(angle * bj_DEGTORAD);
        }
        function GetPolarOffsetY(real y, real distance, real angle) -> real {
            return y + distance * Sin(angle * bj_DEGTORAD);
        }
        
        function MoveLocationPolar(location target, real distance, real angle){
            real x = GetPolarOffsetX(GetLocationX(target), distance, angle);
            real y = GetPolarOffsetY(GetLocationY(target), distance, angle);
            MoveLocation(target, x, y);
        }
        
        function SetUnitPositionPolar(unit target, real distance, real angle){
            SetUnitX(target, GetPolarOffsetX(GetUnitX(target), distance, angle));
            SetUnitY(target, GetPolarOffsetY(GetUnitY(target), distance, angle));
        }
        
        function AngleBetweenCoords(real x1, real y1, real x2, real y2) -> real {
            return bj_RADTODEG * Atan2(y2 - y1, x2 - x1);
        }
        function AngleBetweenWidgets(widget target1, widget target2) -> real {
            return AngleBetweenCoords(GetWidgetX(target1), GetWidgetY(target1), GetWidgetX(target2), GetWidgetY(target2));
        }
        
        function DistanceBetweenCoords(real x1, real y1, real x2, real y2) -> real {
            real dx = x2 - x1;
            real dy = y2 - y1;
            return SquareRoot(dx*dx + dy*dy);
        }
        function DistanceBetweenCoords3D(real x1, real y1, real z1, real x2, real y2, real z2) -> real {
            real dx = x2 - x1;
            real dy = y2 - y1;
            real dz = z2 - z1;
            return SquareRoot(dx*dx + dy*dy + dz*dz);
        }
        
        function DistanceBetweenWidgets(widget target1, widget target2) -> real {
            return DistanceBetweenCoords(GetWidgetX(target1), GetWidgetY(target1), GetWidgetX(target2), GetWidgetY(target2));
        }
        
        function GetTerrainZ(real x, real y) -> real {
            MoveLocation(locationZ, x, y);
            return GetLocationZ(locationZ);
        }
        function GetUnitZ(unit target) -> real {
            return GetTerrainZ(GetUnitX(target), GetUnitY(target)) + GetUnitFlyHeight(target);
        }
        
        function UnitAddAbilityZ(unit target){
            if (GetUnitAbilityLevel(target, AbilityUnitZ) == 0){ UnitAddAbility(target, AbilityUnitZ); }
        }
        function UnitRemoveAbilityZ(unit target){
            if (GetUnitAbilityLevel(target, AbilityUnitZ) > 0){ UnitRemoveAbility(target, AbilityUnitZ); }
        }
        
        function SetUnitZ(unit target, real z) -> unit {
            SetUnitFlyHeight(target, z - GetTerrainZ(GetUnitX(target), GetUnitY(target)), 0);
            return target;
        }
        function SetUnitXY(unit target, real x, real y) -> unit {
            SetUnitX(target, x);
            SetUnitY(target, y);
            return target;
        }
        function SetUnitXYZ(unit target, real x, real y, real z) -> unit {
            SetUnitXY(target, x, y);
            SetUnitZ(target, z);
            return target;
        }
        function SetUnitXYZF(unit target, real x, real y, real z, real f) -> unit {
            SetUnitXY(target, x, y);
            SetUnitZ(target, z);
            SetUnitFacing(target, f);
            return target;
        }
        
        
        
        // https://xgm.guru/p/wc3/perpendicular
        // Находит длину перпендикуляра от отрезка, заданного Xa, Ya, Xb, Yb к точке, заданной Xc, Yc.
        function Perpendicular (real Xa, real Ya, real Xb, real Yb, real Xc, real Yc) -> real {
            return SquareRoot((Xa - Xc) * (Xa - Xc) + (Ya - Yc) * (Ya - Yc)) * Sin(Atan2(Yc-Ya,Xc-Xa) - Atan2(Yb-Ya,Xb-Xa));
        }
        
        
        // https://xgm.guru/p/wc3/warden-math
        // Расстояние между двумя углами
        function AngleDifference(real a1, real a2) -> real {
            real x;
            a1 = ModuloReal(a1, 360);
            a2 = ModuloReal(a2, 360);
            if (a1 > a2) {
                x = a1;
                a1 = a2;
                a2 = x;
            }
            x = a2 - 360;
            if (a2 - a1 > a1 - x){
                a2 = x;
            }
            return RAbsBJ(a1 - a2);
        }
        
        /*
            h - максимальная высота на середине расстояния
            d - общее расстояние до цели
            x - расстояние от исходной цели до точки
        */
        function ParabolaZ(real h, real d, real x) -> real {
            return (4 * h / d) * (d - x) * (x / d);
        }
        
        /*
            zs - начальная высота высота одного края дуги
            ze - конечная высота высота другого края дуги
            h  - максимальная высота на середине расстояния
            d  - общее расстояние до цели
            x  - расстояние от исходной цели до точки
        */
        function ParabolaZ2(real zs, real ze, real h, real d, real x) -> real {
            return (2*(zs + ze - 2*h)*(x/d - 1) + (ze - zs))*(x/d) + zs;
        }
        
        // Приводит угол в божеский вид
        function AngleNormalize(real angle) -> real {
            if (angle > 360){ angle = angle - 360; }
            if (angle < 0){ angle = 360 + angle; }
            return angle;
        }
        
    }
}
//! endzinc
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
32
5 лет назад
3
Как то уныло, побольше бы функций.
function Is2cc takes real r, real cx, real cy, real px1, real py1, real px2, real py2 returns boolean
        local real dx = 0.00 
        local real dy =  0.00 
        local real a =  0.00 
        local real b = 0.00  
        local real c = 0.00 
        
        set px1 = px1 - cx
        set py1 = py1 - cy
        set px2 = px2 - cx
        set py2 = py2 - cy
        set dx = px2 - px1
        set dy = py2 - py1
        set a = dx * dx + dy * dy
        set b = 2.00 * ( px1 * dx + py1 * dy )
        set c = px1 * px1 + py1 * py1 - r * r
        
        if ( -b < 0.00 ) then
            return ( c < 0.00 )
        elseif ( -b < ( 2.00 * a ) ) then
            return ( ( 4.0 * a * c - b * b ) < 0 )
        endif
        return ( a + b + c < 0 )
    endfunction
Проверка на то что пересекает ли вектор окружность,
0
22
5 лет назад
0
Мне бы библиотеку для работы с векторами. Представленные функции я могу и сам написать ничего не импортируя.
0
26
5 лет назад
0
Zahanc:
Мне бы библиотеку для работы с векторами. Представленные функции я могу и сам написать ничего не импортируя.
ну это ради экономии времени
0
29
5 лет назад
0
Мне бы библиотеку для работы с векторами.
Я пока ещё с векторами не работал, как разберусь, напишу.
0
26
5 лет назад
0
Zahanc:
Мне бы библиотеку для работы с векторами. Представленные функции я могу и сам написать ничего не импортируя.
бтв
3
37
5 лет назад
3
Есть куча библиотек, погуглите
DGUI Math содержит вектора и матрицы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.