Как я могу проверить, лежит ли точка между двумя параллельными линиями?


10

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

Внизу экрана (то, что в данный момент) движутся квадраты, на которые должен воздействовать взрыв, контролируемый игроком.

В настоящее время я пытаюсь найти способ обнаружить, находятся ли углы этих квадратов в двух ограничивающих линиях взрыва. Я подумал, что лучший способ сделать это - повернуть углы квадрата вокруг исходной точки, как если бы взрыв был полностью горизонтальным, и посмотреть, были ли значения Y углов меньше или равны ширине взрыва, что Я имею в виду, что они находятся в зоне воздействия, но я не могу работать


Это было полезно для меня: stackoverflow.com/a/3461533/1599699
Андрей

Ответы:


11

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

Вы можете использовать верхний ответ на этот вопрос в stackoverflow, чтобы выяснить, на какой стороне линии (определенной 2 точками на ней) лежит точка.


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


2

Вот как я это делаю (с дополнительной проверкой, являются ли предоставленные плоскости фактически параллельными. Объекты Плоскости содержат уравнение плоскости в такой форме: Ax + By + Cz + D = 0, которое вы можете легко сгенерировать из 3 заданных точки, или из точки и нормали (см. эту страницу, если вы не уверены в математике: http://paulbourke.net/geometry/pointlineplane/ )

bool isPointBetweenParallelPlanes(const vec3 point, const Plane a, const Plane b){
// test if planes are parallel
vec3 cross = a.normal CROSS b.normal;
assert((a.normal CROSS b.normal) == vec3(0,0,0) && "These planes should be parallel.");
return ((a.normal DOT point) + a.D) * ((b.normal DOT point) + b.D) < 0.0;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.