Jak wykryć kolizję między duchem a jakimś kształtem wygenerowanym przez użytkownika.
Na przykład. Na ekranie jest kilka obiektów. Użytkownik bierze palec i rysuje okrąg wokół obiektu (regułą wyboru jest malowanie koła wokół duszka, ale kształty malowania mogą być różne). Muszę wykryć wybrany obiekt, który podobnie jak:
collision-detection
Huwell
źródło
źródło
Odpowiedzi:
Jeśli kształt jest rysowany głównie za pomocą segmentów linii od użytkownika (lub krzywych Beziera z punktami kontrolnymi), można zaimplementować dość powszechnie stosowany algorytm znany jako Twierdzenie o Osi Oddzielającej . Mówiąc prosto: jeśli istnieje oś (wektor jednostkowy reprezentujący kierunek), na której kształty nie zachodzą na siebie (ich rzutowane wartości nie dają dodatniej różnicy), obiekty nie nakładają się. Używałem tego w przeszłości i działało to jak urok.
źródło
Jeśli kształt jest rysowany ręcznie, jak w Crayon Physics , możesz trzymać tablicę linii prostych i sprawdzać kolizje z każdą z nich. Pomimo prostych linii możesz używać krzywych Beziera lub czegoś podobnego.
źródło
Podejścia zależą od wybranych struktur danych, niezależnie od tego, czy są to mapy bitowe, czy wektory.
Pierwsze podejście może obsługiwać dowolne złożone kształty, jest łatwe do wdrożenia, ale zużywa więcej pamięci. W rzeczywistości można zmniejszyć obciążenie pamięci za pomocą kompresji i przyspieszyć ją za pomocą hierarchicznych struktur danych (oktetów) ...
Drugie podejście nie jest tak łatwe do wdrożenia, ale wymaga większej mocy obliczeniowej.
W każdym przypadku zmierzyć, czy ma to znaczenie. Spróbowałbym zrobić pierwszy, ponieważ jest łatwiejszy do wdrożenia. Powodzenia. :)
źródło