Program sprawdzający czy punkt należy do trójkąta - pomoc w wytłumaczeniu

0
 	float ax,ay,bx,by,cx,cy,px,py,d1, d2, d3;   
	cout ...
	
    
      d1 = px*(ay-by) + py*(bx-ax) + (ax*by-ay*bx);        
      d2 = px*(by-cy) + py*(cx-bx) + (bx*cy-by*cx);
      d3 = px*(cy-ay) + py*(ax-cx) + (cx*ay-cy*ax);

     if ((d1<=0)&&(d2<=0)&&(d3<=0) || (d1>=0)&&(d2>=0)&&(d3>=0) ) cout << " Punkt lezy wewnatrz trojkata " << endl;
	 else cout << " Punkt nie lezy wewnatrz trojkata" << endl;

Potrzebuję zrobić taki program jak w temacie, znalazłem podany wyżej kod na pewnym forum, wszystko pięknie i ładnie działa, ale.. nie rozumiem na jakiej zasadzie, myślę, że to coś z wektorami.. Może mógłby ktoś wytłumaczyć na jakiej zasadzie wszystko działa ?

0

Nie mam pojęcia, czym te zmienne są, fajnie by było gdyby ktoś kto pisał ten program je jakoś nazwał przyzwoicie.

Ja wymyśliłem inną metodę. Masz trzy pkty trójkąta, obliczasz jego pole, masz pkt, obliczasz pola trójkątów 2 wierzchołków i tego pktu, po dodaniu do siebie tych pól, pole całkowite powinno wyjść takie samo, jeżeli wychodzi większe, to pkt znajduje się poza trójkątem.
Wzór który wylicza pole trójkąta mając dane długości boków to: sqrt(obw/2 * (obw/2 - a) * (obw/2 - b) * (obw/2 - c))

Drugim znacznie wydajniejszym sposobem jest sprawdzenie czy suma kątów między tym pktem i wierzchołkami daje 360*. (ten sposób wykorzystuje się przy pisaniu gier komputerowych)

0

Znalezione pod natchnieniem MJay'a i jego drugiej propozycji, choć tego nie rozumiem, może się komuś przydać, widać, że niewiele jest obliczeń w porównaniu do metody pierwszej (z obliczaniem pol):

Dany jest trójkąt o wierzchołkach P = (xP, yP), Q = (xQ, yQ), R = (xR, yR). Jak sprawdzić, czy punkt (a, b) leży wewnątrz tego trójkąta? Trójkąt jest częścią wspólną trzech półpłaszczyzn: tych stron prostych, zawierających jego boki (czyli dwa wierzchołki), do których należy trzeci wierzchołek. Odpowiedz można uznać za algorytm...

Według wzoru na prostą przechodzącą przez dwa punty (podanego wyżej) piszemy równania prostych, zawierających boki trójkata:

APx + BPy + CP = 0 - prosta QR,
AQx + BQy + CQ = 0 - prosta PR,
ARx + BRy + CR = 0 - prosta PQ.

Dla każdego wierzchołka P, Q, R obliczamy znak wyrażenia:

(APx + BPy + CP)(APa + BPb + CP),
(AQx + BQy + CQ)(AQa + BQb + CQ),
(ARx + BRy + CR)(ARa + BRb + CR).

Jeśli wszystkie te trzy wyrażenia są dodatnie, to (a, b) leży wewnątrz trójkąta PQR.
Jeśli jedno z tych trzech wyrażeń jest równe 0, to albo trókąt jest odcinkiem, albo (a, b) leży na odpowiednim boku trójkąta.
Jeśli żadne z tych wyrażen nie jest zerem, ale choć jedno jest ujemne, to (a, b) leży na zewnątrz PQR.

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