Скачиваешь с сайта irinabot, запускаешь, запускаешь игру, заходишь в локальную сеть. На сайте выбираешь к какой игре подключиться, эта игра появляется в списке клиента игры. Схоже с гареной.
Проилюстрируем два отрезка, один образованный точками A, B и второй, образованный точками C и D
Нам необходимо найти точку пересечения этих отрезков (если существует). Как это делается? Делается это путем низведения задачи до минимально возможных примитивов, решения задачи на этих примитивах и последующей проверкой полученного ответа в рамках исходной задачи.
В нашем случае, примитивами двух отрезков являются прямые. То есть, нам необходимо найти точку пересечения прямых, на которых лежат наши отрезки, а затем проверить, лежит ли найденная точка в пределах отрезков.
Пунктиром обозначены прямые, на которых лежат отрезки. Я так же буду использовать термин "прямые, пораждаемые отрезками".
Шаг 1
Нам необходимо построить параметрическое уравнение для каждой из наших прямых. Параметрическое уравнение прямой выглядит следущим образом:
P = P1 + k * n
Где P - любая точка на прямой, описанная уравнением, P1 - известная точка на прямой, n - вектор, параллельный прямой, n - произвольный параметр. Я не знаю, как можно в данном текстовом виде обозначить вектор, ибо форма записи со стрелочкой над буковкой мне недоступна, поэтому придется держать в уме, что вектора и параметры обозначаются строчными буками, а точки - прописными. Чтобы было проще отличить вектора от параметров, условимся, что параметр я всегда буду записывать слева, а вектор справа.
Как мы можем построить аналогичное уровнение для наших прямых? Для начала, было бы неплохо получить вектора, параллельные нашим прямым. Это может быть сделано путем вычитания координат точек наших отрезков. То есть, для отрезка AB, вектор будет иметь вид (B - A), а для отрезка CD (D - C)
В таком случае, мы можем составить уровнение для каждой прямой
A + k * (B - A)
C + n * (D - C)
Для простоты записи, обозначим вектор (B - A) как вектор a, и вектор (D - C) как вектор b
A + k * a
C + n * b
Таким образом мы можем составить систему уравнений
P = A + k * a
P = C + n * b
Где P, есть точка пересечения двух прямых, порожденных нашими отрезками. Осталось решить эту систему уравнений.
Шаг 2
Итак, дана система уравнений
P = A + k * a
P = C + n * b
Чтобы найти точку пересечения P, нам необходимо найти неизвестный параметр k первой прямой, либо параметр n второй прямой. Я буду искать параметр k:
P = A + k * a
P = C + n * b
// Составим уравнение
A + k * a = C + n * b
// Решаем
k * a = C + n * b - A
// Видим, в правой половине у нас образуется вектор (C - A),
// для простоты записи, дадим ему имя c
k * a = n * b + c
Необходимо найти параметр k, для этого избавимся от n * b во второй половине уравнения. Сделать это можно путем скалярного произведения вектора b, на другой, перпендикурярный ему вектор (одно из определений скалярного произведения векторов гласит - произведение длин векторов на косинус угла между ними - следовательно, скалярное произведение перпендикулярных векторов дает 0, поскольку косинус 90 градусов равен нулю). Найти этот вектор мы можем путем простой перестановки координат x и y вектора b и изменением знака одной из этих координат. Назовем новый вектор b' (читать "б штрих") = (-b[y], b[x]).
k * a = n * b + c
// Находим скалярное произведение с обеих сторон
// на перпендикулярный вектор b'
k * (a • b') = (n * b + c) • b'
k * (a • b') = n * (b • b') + c • b'
k * (a • b') = c • b'
// Находим параметр k
k = (c • b') / (a • b')
Символ • есть символ скалярного произведения векторов, найдеюсь он корректно отображается в браузере.
Показанные выше вычисления могут показаться немного неожиданными для начинающего, как я тут выражаю ПАРАМЕТР, через ВЕКТОРА, да еще ДЕЛЮ вектора на вектора? Лишь напомню, что результатом скалярного произведения векторов есть скаляр (почему оно так и называется).
Готово, мы нашли формулу вычесления параметра k для прямой, поражденной отрезком AB. Теперь мы можем подставить этот параметр в изначальную формулу A + k * (B - A) и получить точку пересечения наших прямых.
Шаг 3 (есть прямые, а нужны отрезки)
Изначальная задача требовала от нас поиска пересечения отрезков, а не прямых, мы же нашли точку пересечения прямых - бесконечных прямых, бесконечно длинных прямых. Теперь нам нужно проверить, принадлежит ли найденная точка обоим отрезкам. Как это сделать?
Если мы снова взглянем на параметрическое уравнение прямой
P = P1 + k * n
Мы сможем сделать следующий вывод - точка P1, это известная нам точка на прямой, вектор n, есть направляющий вектор до точки P, а параметр k, будет выступать длинной вектора n (или есть говорить совсем твердолобо - количество векторов n, которое помещается между точкой P1 и точкой P).
Вернемся к формуле прямой, поражденной отрезком AB
P = A + k * (B - A)
Где P - найденная нами точка пересечения прямых, A - начальная точка отрезка, k - найденный параметр, а (B - A) вектор из точки A в точку B. Поскольку, в нашем случае, вектор (B - A) был получен из координат точек отрезка, его длина соответствует длине отрезка. Это значит, что параметр k будет принимать значение от 0.0 до 1.0, если найденная точка пересечения P, лежит на отрезке. В противном случае, мы можем завершить наши вычисления, поскольку, хоть прямые и пересекаются, точка пересечения не лежит в пределах обоих отрезков одновременно.
Из этого можно сделать простой вывод, что необходимо решить систему уравнений повторно, выразив параметр n второй прямой, и проверив его на вхождение в диапазон от 0.0 до 1.0
P = A + k * a
P = C + n * b
C + n * b = A + k * a
n * b = A + k * a - C
// Запишем образующийся вектор (A - C) как d
n * b = k * a + d
// Избавимся от параметра k путем скалярного
// произведения вектора a на вектор a' = (-a[y], a[x])
n * (b • a') = (k * a + d) • a'
n * (b • a') = d • a'
n = (d • a') / (b • a')
Готово, теперь остается проверить параметр n на интервал от 0.0 до 1.0.
if k >= 0 and k <= 1 and n >= 0 and n <= 1 then
// Точка пересечения прямых лежит в пределах
// обоих отрезков.
return true
else
return false
endif
Пара оговорок
В финале, хотелось бы добавить
Мы могли бы отказаться от скалярного произведения на перпендикулярный вектор в пользу векторного произведения, но мне показалось, что это лишь усложнит понимание для неопытных пользователей.
В процессе решения системы уравнений в первый раз, нам необходимо добавить проверку скалярного произведения вектора b' с обоими векторами (B - A) и (D - C), ведь если произведение вектора b' на вектор (B - A) дает нуль и на вектор (D - C) дает нуль, это значит что оба вектора перпендекулярны вектору b', а значит они параллельны и пересекаться не могут.
Реализуя данный алгоритм в программе, помните о неточности чисел с плавающией точкой и вместо сравнения с нулем используйте сравнение модуля числа с каким-то минимильным значением, например Abs(x) < 0.0001
Ах, классическая д2. Эпоха становления мерзостного снг-комьюнити массовым. Стримеры, поднявшиеся на демонстрации своих конвульсивных припадков, захлебываясь второсортной матершиной. Сколько славных граждан с инфо превратилось в говно начав играть в это. Столько воспоминаний.
У многих застопорилась работа с выходом рефоржа. У кого-то вылетает игра, у кого-то крашится редактор, у кого-то невыносимо долгая загрузка.
Если в карте не использовалось мемхаков, ждите патчей.
Можно дать одну способность рунных браслетов или благославения элуны всем юнитам и уже этой способности изменять поле резиста через BlzSetAbilityRealLevelField. Если работает, конечно.
потому что там не очень очевидная совместимость с предметами, дающими резист
Помимо этого, если бонусное ХП получаемое от улучшений достигает или превосходит базовый максимальный запас здоровья, выдача этого дела приведет к суициду юнита.
Делать все способности триггерными на основе канала. Редактировать поля канала (иконку, описание, дальность каста, манкост и т.д.) в процессе игры (Действие -> Ability -> Set Real/Integer Field). Тогда в карте будет только 7 абилок на всех героев. PT153:
» WarCraft 3 / 3д камера как в WoW
» WarCraft 3 / Где играть в пиратский (осуждаю) варик?
» Dune the Endless Wars / Обновлениям - быть
» Dune the Endless Wars / Обновлениям - быть
» WarCraft 3 / Глобальные переменные и их количество
» WarCraft 3 / Hashtable 8000
Ред. GetLocalPlayer
» WarCraft 3 / Пересечение двух отрезков
В нашем случае, примитивами двух отрезков являются прямые. То есть, нам необходимо найти точку пересечения прямых, на которых лежат наши отрезки, а затем проверить, лежит ли найденная точка в пределах отрезков.
Я не знаю, как можно в данном текстовом виде обозначить вектор, ибо форма записи со стрелочкой над буковкой мне недоступна, поэтому придется держать в уме, что вектора и параметры обозначаются строчными буками, а точки - прописными. Чтобы было проще отличить вектора от параметров, условимся, что параметр я всегда буду записывать слева, а вектор справа.
Если мы снова взглянем на параметрическое уравнение прямой
Вернемся к формуле прямой, поражденной отрезком AB
» Dota 2 / Dota 2 Classic
» WarCraft 3 / Проблема с картой
Если в карте не использовалось мемхаков, ждите патчей.
» WarCraft 3 / Warcraft 3 Reforged: Патч 1.32.9
Ред. GetLocalPlayer
» WarCraft 3 / Warcraft 3 Reforged: Патч 1.32.9
» WarCraft 3 / Warcraft 3 Reforged: Патч 1.32.9
» WarCraft 3 / Warcraft 3 Reforged: Патч 1.32.9
Ред. GetLocalPlayer
» WarCraft 3 / Reforged - мышь в центре экрана
» WarCraft 3 / Reforged - мышь в центре экрана
» WarCraft 3 / Reforged - мышь в центре экрана
» WarCraft 3 / Релиз Warcraft 3: Reforged
» WarCraft 3 / Unseen (клип) (цветной)
Ред. GetLocalPlayer
» WarCraft 3 / [Lua] Универсальный каст
» WarCraft 3 / Редактор кода vJass в рефоржеде
» WarCraft 3 / Изменение сопротивления магии в 1.32?
» WarCraft 3 / Изменение сопротивления магии в 1.32?
» WarCraft 3 / Универсальные хоткеи для абилок.
PT153: