XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
Как вычислить координаты для каста?
Один из случаев - нахождение точек пересечения окружностей. Сравнить их расстояние до героя и выбрать ближайшую. Но может быть много случаев расположения целей и я не могу придумать универсальный алгоритм.
Миниатюры
Кликните на картинку для увеличения
Название:  ss+(2015-03-11+at+10.42.25).png
Просмотров: 73
Размер:  64.9 Кбайт  
Старый 11.03.2015, 22:46
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,598
Активность:
посчитать сколько есть допустимых целей в окружности с радиусом R вокруг каждой цели и выбрать максимальное число...
Старый 12.03.2015, 07:35
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
Выбрал, а координаты то где?
Старый 12.03.2015, 10:17
Doc

offline
Опыт: 63,163
Активность:
посчитать сколько есть допустимых целей в окружности с радиусом R вокруг каждой цели и выбрать максимальное число...
Гений
Тебе нужно вписать многоугольник в окружность. Вот и бери все возможные выпуклые многоугольники, определяй необходимый радиус и центр окружности в которую этот многоугольник вписан, сравнивай расстояние до центра и радиус с нужными тебе параметрами, выбирай нужную окружность. Магия.
Старый 12.03.2015, 13:33
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
Doc, Уважаемый друг, будь любезен, нарисуй графически то, что ты написал, а то как-то сумбурно звучит.
JaBeN_Симфер добавил:
Задача в том, что меня интересуют координаты не центра между целями, а той точки, которая является ближайшей к герою, но покрывающая своим радиусом группу целей, как на картинке.
Старый 12.03.2015, 16:11
ScorpioT1000
Работаем
offline
Опыт: отключен
сначала поставить xgm.guru/p/wc3/sc-sorted-selector (в примере - как выбрать всех юнитов в допустимом радиусе каста)
можно и руками с forgroup итп
дальше
простой способ: сравним каждый с каждым, т.е. создаем массив центра координат между каждой группой юнитов (какраз селектор поможет пробежаться по всем и не париться с group и прочей ерундой)
тоесть если есть юниты a,b,c то у нас получится список центров a-b-с, a-b, a-c, b-c (оптимизируется от a-b, a-c, b-a, b-c, c-a, c-b, a-b-c, b-a-c, c-a-b, c-b-a)
дальше если надо взять самую весомую группу, то берем центр с самым большим количеством юнитов, у нас это a-b-c и бабахаем по этим юнитам дамагом
если надо взять ближайшую, считаем дистанции до каждого центра и также бабахаем
ScorpioT1000 добавил:
элемент списка выглядит примерно так в итоге
struct mySpellAvgGroup {
 unit insideUnits[];
 int unitsCount = 0;
 real x;
 real y;
}
только щас понял, что там не центры, ну тогда надо вписывать многоугольник в окружность
и как вот тут поступать
там надо будет сравнить, у какой группы больше юнитов, потом взять большие и у них уже сравнить, центр какой ближе к тебе
и тогда да, будет самое оптимальное решение, это двумерная задача математической оптимизации решений
это задача не для жасса
Старый 12.03.2015, 17:04
DioD

offline
Опыт: 45,184
Активность:
  1. Окружность задаётся формулой, узнать пересекаются ли окружности можно очень легко и просто, еще есть атомарные правила которые можно использовать для достижения результата.
  2. Не надо бегать по юнитам, мы знаем радиус нашего АОЕ, достаточно взять ближайшего юнита, взять АОЕ*2, если другие цели есть, точку приложения сдвинуть чтобы их тоже зацепило.
Старый 12.03.2015, 18:14
ScorpioT1000
Работаем
offline
Опыт: отключен
частный случай
кто там у нас математик
Надо нарисовать такую окружность, центр которой (искомая точка) будет ближе всех к кастеру, при этом она будет включать целевых юнитов внутри себя
надо найти общий случай, число целевых юнитов может быть сколько угодно
причем не все могут вписаться в окружность
все радиусы константны и равны одному числу

Отредактировано ScorpioT1000, 13.03.2015 в 12:40.
Старый 13.03.2015, 12:34
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
Все оказалось проще, чем я думал. Достаточно просто найти точки пересечения окружностей вокруг целей. Сначала надо отсортировать все цели по отдаленности от героя в порядке убывания (от самых дальних к ближним). Затем проверить все точки на идеальную группу:
1я точка - на позиции героя
loop
2я точка - на отрезке между героем и первой отсортированной целью
3я и 4я точки будут точками пересечения окружностей между первой и второй (и каждой последующей) целью
endloop
Из-за такой сортировки отсутствуют дублирующие результаты и в группировку не попадают цели, находящиеся дальше, чем опорная цель.
Спасибо всем, кто уделил этому время.
Старый 17.03.2015, 11:05
ScorpioT1000
Работаем
offline
Опыт: отключен
Мои поздравления =)
Старый 17.03.2015, 11:08
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 20:20.