Jak mogę sprawdzić, czy punkt leży między dwiema równoległymi liniami?


10

W projektowanej przeze mnie grze jest podmuch, który wystrzeliwuje z punktu początkowego w kierunku myszy. Szerokość tego podmuchu zawsze będzie taka sama.

Wzdłuż dolnej części ekranu (co jest obecnie) poruszają się kwadraty, które powinny być wykonane przez podmuch kontrolowany przez gracza.

Obecnie próbuję znaleźć sposób, aby dowiedzieć się, czy rogi tych kwadratów znajdują się w obrębie dwóch linii granicznych wybuchu. Pomyślałem, że najlepszym sposobem na to byłoby obrócenie rogów kwadratu wokół punktu początkowego, tak jakby podmuch był całkowicie poziomy i zobaczyć, czy wartości Y narożników były mniejsze lub równe szerokości podmuchu, który oznacza, że ​​leżą w obrębie dotkniętego regionu, ale nie mogę tego wypracować


To mi pomogło
Andrew

Odpowiedzi:


11

Punkt znajduje się między 2 równoległymi liniami, jeśli jest to jedna strona jednej linii i druga strona drugiej linii (zapewniając linie wskazują w tym samym kierunku).

Możesz użyć najwyższej odpowiedzi z tego pytania przy przepełnieniu stosu, aby ustalić, po której stronie linii (zdefiniowanej przez 2 punkty) leży punkt.


Alternatywną metodą byłoby obliczenie odległości od punktu do linii środkowej i porównanie jej z połową grubości wybuchu.


2

Tak to robię (z dodatkowym sprawdzeniem, czy podane płaszczyzny są faktycznie równoległe. Obiekty Plane zawierają równanie płaszczyzny w tej formie: Ax + By + Cz + D = 0, które można łatwo wygenerować z 3 podanych punktów lub z punktu i normalnie (zobacz tę stronę, jeśli nie masz pewności co do matematyki: 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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.