Kolizja z trojkatem...

0

Witam! Czy moglbyscie mi <ort>pomóc</ort> ze sprawdzeniem czy ort! kolizja z trojkatem w grach 2D (chodzilo by mi o sprawdzenie czy jakis punkt jest w trojkacie).

0

Wyznaczasz wzór prostych zawierających poszczególne boki trójkąta. Jeśli punkt znajduje się po po właściwej stronie każdej z 3 prostych, znajduje się w trójkącie. Możesz też zrobić to wektorowo.

0

a czy byl bys tak mily i podal bys mi ten wzor?

0
Yabol napisał(a)

a czy byl bys tak mily i podal bys mi ten wzor?

Wzór na prostą przechodzącą przez dwa punkty (mogą to być dwa wybrane wierzchołki trójkąta), to:
(y1 ? y0)(x ? x0) ? (x1 ? x0)(y ? y0) = 0
gdzie:
x0, y0 - współrzędne jednego punktu,
x1, y1 - współrzędne drugiego punktu.

Wzór ten wziąłem ze strony: http://pl.wikipedia.org/wiki/Prosta :)

Po podstawieniu współrzędnych i przekształceniu tego równania otrzymasz zależność y(x), czyli wzór prostej.
Musisz jeszcze pamiętać, że współrzędne punktów na ekranie są zwykle zapisywane inaczej niż w matematyce. Chodzi głównie o to, że w lewym górnym rogu masz zwykle współrzędną (0,0) i o ile współrzędna "x" zmienia się całkiem nieźle (od lewej do prawej), to współrzędna "y" już nie najlepiej, bo rośnie w dół, czyli odwrotnie niż w matematyce. Najprościej rozwiązać ten problem zmieniając znak współrzędnej "y", czyli mnożąc ją przez (-1). Najlepiej zresztą zdefiniować swój układ współrzędnych (dla wygody) i wszystko przeliczać na ten układ, co pewnie już dawno zrobiłeś...

0

thx za pomoc , ja pisze gierke w OpenGl

0
Szczawik napisał(a)

Możesz też zrobić to wektorowo.

Czy mógłby ktoś konkretnie wyjaśnić to zagadnienie lub jak szukać czegoś na ten tenat?

0

Aby stwierdzić kolizje punktu D z trójkąt ABC trzeba sprawdzić, czy punkt D leży po tej samej stronie:

  • prostej AB, co punkt C,
  • prostej BC, co punkt A.
  • prostej CA, co punkt B,

Pokaże sposób jak stwierdzić pierwszy warunek - wspólne położenie punktów C i D względem prostej AB, pozostałe dwa warunki można sprwadzić analogicznie. A więc mamy nasz trójkąt:
user image
Wektory AC i AD tworzą z wektorem AB kąty fi oraz ni. Punkty D i C leżą po tej samej stronie prostej wówczas, gdy obydwa kąty fi oraz ni mieszczą się wspólnie w przedziale 0-180 stopni lub wspólnie w przedziale 180-360 stopni. Dzieje się tak, gdy sin(fi) i sin(ni) mają wspólne znaki, czyli sin(fi)sin(ni)>0
Wektory nam ułatwiają tyle, że znak sinusa pomiędzy dwoma wektorami jest zgodny ze znakiem iloczynu wektorowego tych wektorów, zatem warunek z sinusami możemy zmianić na:
(AB x AC)
(AB x AD)>0.
Używając słabej nierówności (>=) dołączymy do badania kolizji krawędzie trójkąta. Wtedy uwaga - jeśli trójkąt będzie odcinkiem, tzn jeśli któryś z wierzchołków będzie leżeć na przeciwległym odcinku, to zawsze kolizja da nam wynik pozytywny. Wynika to z tego, że kąt fi (kąt wewnętrzny trójkąta) będzie zawsze równy zeru lub 180 stopni, czyli jego sinus równy zero.

0

Yeah. Dzięki, o to chodziło.

0
function n2disPointinTriangle(P, P1, P2, P3: TextPoint): Boolean;
  var
    t1, t2, t3: single;
  begin
    t1 := (P3.Y-P1.Y)*(P.X-P1.X) - (P3.X-P1.X)*(P.Y-P1.Y);
    t2 := (P2.Y-P3.Y)*(P.X-P3.X) - (P2.X-P3.X)*(P.Y-P3.Y);
    t3 := (P1.Y-P2.Y)*(P.X-P2.X) - (P1.X-P2.X)*(P.Y-P2.Y);
    if ((t1>0)and(t2>0)and(t3>0))or((t1<0)and(t2<0)and(t3<0)) then
      Result := True
    else
      Result := False;
  end;

z czego wygladac to bedzie tak
float choj_ci_w_aszloch(punkt punktu :O,3 punkty trojkata) {
t1, t2, t3 to ma byc tez float
reszta jest tez oczywista :C

}

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