Algorytm wyznaczający punkt przecięcia przekątnych

0

Mam 4 punkty czworokąta, jak obliczyć punkt przecięcia jego przekątnych. Na internecie wszędzie jest napisane by zrobić po prostu 2 proste i przyrównać(znaleźć ich przecięcie)

Tak jak na kartce wiem jak to zrobić, tak nie potrafię tego zaprogramować :/ Pomógłby ktoś?

0

Punkt przecięcia prostych jest niedobry, musi być punkt przecięcia odcinków. Przekątne czworokąta mogą sie nie przecinać.

0

Tak jak na kartce wiem jak to zrobić, tak nie potrafię tego zaprogramować :/ Pomógłby ktoś?

Na kartce masz kratki, więc to się nie liczy. Jak byś to zrobił matematycznie na kartce?

Hmm, jeśli chcesz znaleźć przekątnych, to znaczy po prostu że masz dwie proste (AC i BD) i szukasz punktu w którym się przecinają tak?

Można to w zasadzie rozwiązać dużo prościej, ale jako że uzasadnienie tego wymagałoby trochę teorii, intuicyjne licealne rozwiązanie:
Najpierw wyliczasz z AC i BD równania prostych w postaci kierunkowej (y = ax + b). Jest to w zasięgu każdego, jeśli dobrze w głowie liczę to a = (Cy-Ay)/(Cx-Ax), b = Cy-a*Cx, analogicznie dla BD.
Zostaje wtedy prosty układ równań do rozwiązania:
\left{\begin{matrix}<br> y = ax + b\<br> y = cx + d<br> \end{matrix}\right.
Co daje x = (d-b)/(a-c), i z tego wychodzą punkty przecięcia.

Elegancję tego rozwiązanie psuje skutecznie fakt, że musisz wziąć pod uwagę przypadki specjalne, kiedy prosta AC albo BD jest równoległa do osi Y (i nie pomylić się przy tym).

0

Ja się nie ograniczam do wielokątów wypukłych i proponuję równania parametryczne - nie trzeba rozpatrywać przypadków szczególnych (przekątnych równoległych do osi).
user image
Rozwiązujemy układ równań
A+t(C-A) = B+s(D-B)
sprawdzamy czy rozwiązania t,s są z przedziału [0,1].

2

@msm przesadził lekko, licznik oraz mianownik równania wystarczy pomnożyć przez (Dx-Bx)*(Cx-Ax) i nie trzeba sprawdzać żadnych przypadków szczególnych.
x=((Dy*(Dx-Bx)-Dx*(Dy-By))*(Cx-Ax)-(Cy*(Cx-Ax)-Cx*(Cy-Ay))*(Dx-Bx))/(Cy-Ay)*(Dx-Bx)-(Cx-Ax)*(Dy-By)
natomiast jak w powyższym równaniu zastąpić x na y zaś y na x to wyjdzie równanie dla y
y=((Dx*(Dy-By)-Dy*(Dx-Bx))*(Cy-Ay)-(Cx*(Cy-Ay)-Cy*(Cx-Ax))*(Dy-By))/(Cx-Ax)*(Dy-By)-(Cy-Ay)*(Dx-Bx)

po prostych przekształceniach:
x=((Cx-Ax)*(Dx*By-Dy*Bx)-(Dx-Bx)*(Cx*Ay-Cy*Ax))/((Cy-Ay)*(Dx-Bx)-(Dy-By)*(Cx-Ax))
y=((Dy-By)*(Cx*Ay-Cy*Ax)-(Cy-Ay)*(Dx*By-Dy*Bx))/((Dy-By)*(Cx-Ax)-(Cy-Ay)*(Dx-Bx))

Mianownik tu będzie zerem tylko kiedy nie da się jednoznacznie wyznaczyć punktu przecięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1