Spoglądając na dwie figury na kartce bezproblemowo można określić czy się przecinają. Jednak jak można nauczyć komputer do sprawdzenia czy figury mają wspólną część? Zakładamy, że figury są wypukłe. W tym artykule zostanie przedstawione próba wykrycia kolizji poprzez sprawdzenie czy chociaż jeden punkt jednej z figur leży wewnątrz drugiej.
W rozwiązaniu problemu zostanie wykorzystana metoda, która pozwala określić po której stronie prostej leży punkt. Rozpatrzmy następujący układ:
Dla dowolnego punktu P oraz dwóch punktów końcowych A i B pewnego odcinka można obliczyć wartość d = (Px-Ax)(By-Ay) - (Py-Ay)(Bx-Ax). O położeniu punktu decyduje obliczone d. Dla d = 0 punkty leżą na tej samej prostej, dla d < 0 po jednej stronie, a dla d > 0 po drugiej stronie.
Dla danej figury wyznaczamy punkt środkowy. Figury wprowadzone do programu będą wielokątami wypukłymi, więc wystarczy użyć średniej arytmetycznej.
Pierwszy krok polega na obliczeniu dla punktu środkowego współczynników dla każdego boku. Następnie wybieramy inny punkt i powtarzamy ten proces. Jeśli wszystkie obliczone wartości mają ten sam znak to znaczy, że punkt znajduje się wewnątrz figury. W przeciwnym razie na zewnątrz. W przypadku dwóch figur cały ten proces porównywania robimy dla każdego punktu drugiej figury i jeśli choć jeden znajduje się wewnątrz pierwszej to figury się przecinają.
Do obliczania wartości d wystarczy poniższa funkcja:
Wykorzysta ją funkcja CzyCzescWspolna(), która dla podanych dwóch wielokątów poda czy mają część wspólną. Przyjmujemy, że wielokąt jest opisany przez listę punktów i są one posortowane względem kąta obrotu wokół środka figury.
Algorytm początkowo wyznacza punkt środkowy i wartości d dla każdego z boków figury. Następnie dla każdego punktu z drugiej figury sprawdzamy czy leży wewnątrz pierwszej. Jeśli żaden punkt nie zostanie wykryty to zwracamy fałsz.
Do przetestowania napisanego kodu można skorzystać z poniższego fragmentu kodu: