http://ideone.com/m0tKkS
Dlaczego funkcja intersection nie działa poprawnie? Te dwa odcinki nie przecinają się, jednak iloczyny wektorowe (wyznaczniki odpowiednich macierzy) są różnych znaków. Próbowałem liczyć to na tysiące sposobów, w każdym jednak jest problem, którego nie potrafię obejść lub jego obejście byłoby zbyt kosztowne czasowo. Co ciekawe - opierałem się na tym algorytmie
http://www.algorytm.org/geometria-obliczeniowa/przecinanie-sie-odcinkow.html
którego implementacja na owej stronie również uważa, że takie odcinki się przecinają.
Ponieważ jest okropnie przekombinowana, linia przez A-B przecina linię przez C-D w:
x=((Bx-Ax)*(Dx*Cy-Dy*Cx)-(Dx-Cx)*(Bx*Ay-By*Ax))/((By-Ay)*(Dx-Cx)-(Dy-Cy)*(Bx-Ax))
y=((Dy-Cy)*(Bx*Ay-By*Ax)-(By-Ay)*(Dx*Cy-Dy*Cx))/((Dy-Cy)*(Bx-Ax)-(By-Ay)*(Dx-Cx))
Wystarczy sprawdzić czy x
lezy pomiędzy Ax
a Bx
Wiem o tym, ale tutaj jest mnóstwo przypadków wynikających z dzielenia przez zero. Imo nie jest to dobre rozwiązanie. Tym bardziej, że tracimy na dokładności tutaj.
Nikt nie jest w stanie powiedzieć mi jak naprawić mój algorytm?
- wywalić to co napisałeś.
- napisać wg tego co napisałem.
Twoje rozwiązanie jest błędne, nie uwzględnia kilku możliwości. Jedyne co napisałeś, to przekształcenie dwóch wzorów znanych z podstawówki.
Jest poprawne i nie uwzględnia jedynie zerowych długości wektorów.
I dzielenia przez zero w dwóch przypadkach, skąd podczas implementacji tego robią się co najmniej trzy.
Tak dokładnie dwa przypadki:
- Pierwszy wektor ma zerową długość - czyli nie jest wektorem
- Drugi wektor ma zerową długość - czyli nie jest wektorem
Jesteś pewien?
http://ideone.com/fCul0s
http://ideone.com/AeRRKS
To może mnie mądrala oświeci w jakim punkcie
_13th_Dragon napisał(a):
linia przez A-B przecina linię przez C-D
gdzie A(0,0), B(1,1), C(1,1), D(5,5)
Temat brzmi "Przecinanie się dwóch odcinków". Proste wymyśliłeś sam, a te odcinki się przecinają, tak? Czy nie?
W podpowiedzi http://4programmers.net/Forum/1095898 podałem wyraźnie, możesz sobie to przerobić na odcinki.
Sprawdzaj po prostu czy oba punkty pierwszego odcinka znajdują się po tej samej prostej wyznaczonej przez drugi odcinek.
http://www.math.us.edu.pl/pgladki/faq/node102.html
Zatem podales algorytm sprawdzania przecinania się "linii" poprzez wyliczenie punktu przecięcia i sprawdzenie czegoś tam? Genialne..
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.