Легко, вопрос в том, насколько оптимизированно перебираем и этот треугольник всегда в таком положении (под таким углом) или меняет положение и угол, а может и масштабы?
Если в одном положении - то бери всех юнитов в области с треугольником (как на скрине):
Иначе бери всех юнитов с карты (если другого варианта удобного у тебя нет).
Далее нам надо знать координаты всех 3 углов треугольника (точки A(a1, a2), B(b1, b2), C(c1, c2)).
Далее перебираем юнитов в группе, что выбрали ранее и берем их точки P(x, y).
Далее с помощью векторных произведений вычисляем AP * AB, BP * BC, и CP * CA.
Если все три векторных произведения имеют одинаковый знак (или равны нулю), то точка P лежит внутри треугольника или на его границе.
Векторное произведение вычисляется вот так:
AP = {x-a1, y-a2}
AB = {b1-a1, b2-a2}
AP * AB = (x-a1) * (b1-a1) + (y-a2) * (b2-a2) = V1
Также вычисляем и другие произведения:
BP * BC = V2
AP * AB = V3
Если (V1 >= 0 и V2 >= 0 и V3 >= 0) ИЛИ (V1 <= 0 и V2 <= 0 и V3 <= 0) то точка находится внутри треугольника, иначе нет.
Изи.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
26
Легко, вопрос в том, насколько оптимизированно перебираем и этот треугольник всегда в таком положении (под таким углом) или меняет положение и угол, а может и масштабы?
Если в одном положении - то бери всех юнитов в области с треугольником (как на скрине):
Иначе бери всех юнитов с карты (если другого варианта удобного у тебя нет).
Далее нам надо знать координаты всех 3 углов треугольника (точки A(a1, a2), B(b1, b2), C(c1, c2)).
Далее перебираем юнитов в группе, что выбрали ранее и берем их точки P(x, y).
Далее с помощью векторных произведений вычисляем AP * AB, BP * BC, и CP * CA.
Если все три векторных произведения имеют одинаковый знак (или равны нулю), то точка P лежит внутри треугольника или на его границе.
Векторное произведение вычисляется вот так:
AP = {x-a1, y-a2}
AB = {b1-a1, b2-a2}
AP * AB = (x-a1) * (b1-a1) + (y-a2) * (b2-a2) = V1
Также вычисляем и другие произведения:
BP * BC = V2
AP * AB = V3
Если (V1 >= 0 и V2 >= 0 и V3 >= 0) ИЛИ (V1 <= 0 и V2 <= 0 и V3 <= 0) то точка находится внутри треугольника, иначе нет.
Изи.
Загруженные файлы
Принятый ответ
32
Если это абилка по типу волны, просто строем биссектрису и движем по ней перебор в радиусе, радиус увеличиваем с каждым шагом.
Ответы (2)
16
quq_CCCP, я изначально так и делал, но понял что совсем коряво выделяются юниты для такой абилки, абилка как-бы по типу волны, но выделятся юниты должны чётко в треугольнике, человек сверху уже помог.
32
LastUchiha, как бы дефолт абилки делают почти так же, но у них там событие units in range и фильтр.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.