Имея 3 вектора, как проверить, можно ли провести через них прямую линию

Я получаю позиции 5 врагов в игре в векторах. В зависимости от выбранного расстояния количество врагов может варьироваться от 0 до 5. Мне нужно знать их векторы каждый раз, чтобы проверить, можно ли провести прямую линию через определенное количество героев (векторов).

После этого моему герою придется использовать свою способность под названием стена. Он состоит из двух начальных и конечных векторов. Таким образом, проверьте, может ли мой герой поставить стену на врагов в очереди, чтобы поймать их

Допустим, есть 3 вражеских героя, позиции которых я могу получить. Мне нужно выяснить, могу ли я пройти через них напрямую, чтобы использовать на них способность.

Вот как выглядит использование способности в игре

4 ответа

Любую линию на плоскости можно описать уравнением a*x + b*y + c = 0 с участием (a, b) ≠ (0, 0). Обратите внимание: если у вас есть уравнение такой формы, умножение каждого коэффициента на одно и то же число дает уравнение, описывающее ту же строку. Вот в чем причина (a, b, c) называется однородным координатным вектором для этой линии.

Как ты находишь a, b, c? Один простой подход - рассматривать это как три линейных уравнения с тремя неизвестными. Вы подключаете x а также y координаты для всех ваших трех точек, и получите древовидные уравнения для a тщательный c. Однако здесь есть одна загвоздка. Поскольку правая часть каждого уравнения равна нулю, a = b = c = 0всегда решение. В тех случаях, когда есть только одно решение, это будет оно. Итак, для того, чтобы была линия, вам нужно более одного решения. Математический инструмент для определения того, имеет ли система уравнений более одного решения, является определяющим . Он равен нулю, если в системе нет единственного уникального решения.

Короче говоря: три точки коллинеарны (на линии), если

          ⎛x1 y1 1⎞
det ⎜x2 y2 1⎟ = 0
    ⎝x3 y3 1⎠

Однородный вектор координат, описывающий линейный мир, соответствует ядру этой матрицы.

Если кто-то предпочитает геометрию линейной алгебре ... Тогда можно вычислить скалярное произведение (unit-vector1. Unit-Vector2). Это равно SIN угла между ними.

Итак, если единичный вектор - это позиция стрелка к цели1, единичный вектор2 - это стрелок к цели2 и т.д ... тогда, когда DOTPRODUCT (Vector1, vector2) = 1 и DOTPRODUCT (Vector1, vector3) = 1, то три точки находятся в сизигии. .

И повторите от стрелка к любому количеству мишеней, чтобы определить, находятся ли некоторые или все точки в сизигии.

Вы можете описать все точки, принадлежащие прямой (x0, y0) + (dx, dy)t = (x1, y1). Выберите любые две точки и t равным 1, и вы получите (dx, dy) для линии, соединяющей две точки. Теперь вам нужно будет найти расстояние между этой линией и (x2, y2). это расстояние между (x2, y2) и (xd, yd), где с одной стороны (xd, yd) = (x0, y0) + t1 (dx, dy), а с другой стороны (xd, yd) = (x2 , y2) + t2 *(-dy, dx). Решая эти два уравнения, вы найдете t1, t2, (xd, yd) и расстояние между (x2, y2) и (xd, yd), которое представляет собой расстояние между (x2, y2) и линией, соединяющей (x0, y0) и (x1, y1).

Зная это, вы выбираете точки с помощью min_x и max_x и вычисляете расстояние между линией, соединяя указанные точки и остальные точки. Если расстояние меньше некоторого порогового значения по вашему выбору, тогда вы можете предположить, что у вас может быть линия, проходящая через все точки.

Из вашего утверждения о том, что есть начало и конец, я понимаю, что вы выбираете двух врагов и хотите заманить в ловушку все, что находится между ними.

Таким образом, вы на самом деле ищете не прямую линию, которая может быть проведена через позиции ваших врагов, но если они находятся внутри прямоугольника. Было бы очень маловероятно, а для большего количества точек почти невозможно, чтобы все они были коллинеарны в любом случае.

Так что это становится довольно тривиальным. Вы проводите линию через начального и конечного врага. Затем вы сравниваете оставшееся расстояние врагов до этой линии с шириной вашего AoE. Может быть, вы хотите также обработать некоторую ширину тела в этом расчете.

https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line

Другие вопросы по тегам