Potrzebuję pomocy w tworzeniu wyspecjalizowanego algorytmu kolizji linii, który pozwala "ciąć narożniki" pod pewnymi kątami.Tricky Line Algorithm dla gry (agnostyczny język)
Na poniższych zdjęciach niech niebieski kwadrat reprezentuje gracza, a czarny kwadrat - ścianę. Białe kwadraty, a następnie stanowią kwadraty w „polu widzenia” gracza (poprawnych kwadraty), a szare kwadraty są kwadratami zewnątrz „linii wzroku” gracza (nieprawidłowy kwadraty):
drugi obraz jest, gdy robi się bardziej interesująca, gdyż zaczynamy narożniki cięcia:
weźmy bliżej przyjrzeć się tej linii, która jest dozwolona, pomimo przechodzącej nad rogu ściany:
Linia wolno, ponieważ:
- dx < = 0,5 (o kwadratowym będącego 1x1)
- dx/dy jest powyżej określonym stosunku (na przykład, 2 - I nie wiem dokładnej wartości przedstawione na tych obrazach)
odwrotna linia nie jest dozwolone, ponieważ stosunek (dy/DX w tym przypadku) jest zbyt niska.
A może powinienem mówić o kąt wejścia vs wyjściu z placu ....
Głównym problemem mam jest to, że nie mogę dowiedzieć się, jak generalizować rozwiązanie dla wektorów podróżujących pod dowolnym kątem między dwoma punktami na siatce. Nie mogę zdecydować, czy powinnam użyć trygonometrii, czy co. Do tej pory moim najbliższym rozwiązaniem było użycie dziesiętnych części przechwytywania linii z każdym kwadratem jako dx i dy i sprawdzenie, czy jest dozwolone w oparciu o nachylenie linii i jaki kwadrant jest w niej.
Czy ktoś może pomóc?
Przyjrzałem się także pożyczaniu lub zaczynaniu od innych algorytmów liniowych, ale nie znalazłem niczego zbyt użytecznego. Większość z tych, które widziałem, chce, żeby linia od (x1, y1) do (x2, y2) była taka sama jak od (x2, y2) do (x1, y1), co sprawia, że problem jest zupełnie inny.
Przypuszczam, że możesz mieć wiele ścian i nie zawsze sąsiadują one z pozycją gracza? Czy możesz opublikować swój aktualny algorytm (przynajmniej pseudokod)? – Groo
Moją pierwszą myślą jest przyjrzeć się, jak blisko linii dociera do środka placu. Ale w twoim drugim przykładzie nie ma dla mnie sensu, aby ten proces nie był symetryczny: widzę cię, ale nie widzisz mnie? – Teepeemm
Dokładnie, Teepeemm: Linia od punktu A do B nie jest zwykle taka sama jak z punktu B do A, kiedy dx! = Dy! = 0. Zobaczę, czy mogę uzyskać przykład pseudokodu. –