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

Rectange

Что это?

По давней традиции в играх используются прямоугольники ориентированные по осям. Это упрощает математику и не заставляет хорошо учиться в школе. Но что если вы не такой как все вам нужен прямоугольник со свободным углом вращения?

Как пользоваться?

Это структура. Поэтому достаточно её создать. Так же, можно воспользоваться особенностью структур и сразу вызывать её методы без смс и регистрации.
Rectangle r = Rectangle.new(centerX, centerY, width, height, radians).translatePolar(200, radians);
Для запуска требуется JNGP или Reforged.

В чём соль?

Затевалась вся эта затея ради функции distanceSquaredXY которая возвращает квадрат расстояния от заданной точки до ближайшей точки прямоугольника. Что позволяет проверить наличие юнита в прямоугольнике с учётом коллизии.
Rectangle r = Rectangle.new(centerX, centerY, width, height, radians);

GroupClear(g);
GroupEnumUnitsInRange(g, r.cx, r.cy, r.diagonal * .5 + 200, null);
ForGroup(g, function(){
    target = GetEnumUnit();
    
	if (!UnitAlive(target)) return;
    if (IsUnitOwnedByPlayer(target, GetOwningPlayer(caster))) return;
    
	targetX = GetUnitX(target);
    targetY = GetUnitY(target);
    
	distance = r.distanceXY(targetX, targetY);
    if (distance < 0 && !IsUnitInRangeXY(target, targetX, targetY + SquareRoot(-distance), 0)) return;

    SetUnitExploded(target, true);
    KillUnit(target);
});

Методы

method setData(real cx, real cy, real width, real height, real radians) -> Rectangle
method setCenter(real cx, real cy, real radians) -> Rectangle
method setSize(real width, real height, real radians) -> Rectangle
method setRadians(real radians) -> Rectangle
method translateOffset(real dx, real dy) -> Rectangle
method translatePolar(real distance, real radians) -> Rectangle
method rotate(real ox, real oy, real radians) -> Rectangle
rotate поворачивает прямоугольник на заданный угол вокруг заданной точки.
method distanceXY(real x, real y) -> real
distanceXY возвращает квадрат расстояния между точкой [x, y] и ближайшей точкой на стороне прямоугольника. Для точки лежащей вне прямоугольника возвращает отрицательное значение расстояния.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
23
1 год назад
0
Нормально запарились над мелочами :D
0
29
1 год назад
Отредактирован nazarpunk
0
Нормально запарились над мелочами :D
Да не, лажа какая-то, в WebDemo событие touchmove не обрабатывается и соответственно с мобилок демку не пощупать.
0
37
1 год назад
Отредактирован ScorpioT1000
0
Классно, а теперь в 3д с поверхностями)
0
23
1 год назад
Отредактирован konvan5
0
Вы делали проверку нахождения юнита в прямоугольнике, учитывая его физический размер полностью? То есть чтобы весь "круг физического размера" вошел в прямоугольник, иначе он не полностью внутри.

Я так понимаю с помощью этой системы можно такое закодить.
0
29
1 год назад
0
konvan5, если по простому, детектится наложение круга на прямоугольник. Визуализацию можно в WebDemo глянуть.
Иначе узкий квадрат не будет задевать жирных юнитов. Но математика там не сложная, если нужно могу дописать.
Классно, а теперь в 3д с поверхностями)
Когда завезут нативку по получению центра модели юнита, тогда сделаю 👽
0
19
1 год назад
0
Ну голова! Спасибо большое.
2
29
1 год назад
Отредактирован nazarpunk
2
konvan5, добавил distanceSquaredInnerXY, которая возвращает положительное значение если точка внутри прямоугольника и отрицательное если снаружи. Теперь через тот же IsUnitInRangeXY можно легко посчитать, находится ли юнит полностью в прямоугольнике.
0
29
1 год назад
0
Вышла новая версия!
Изменения синтаксиса, оставил только одну функцию distanceXY чтоб не плодить лишний код.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.