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).
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.
a czy byl bys tak mily i podal bys mi ten wzor?
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ś...
thx za pomoc , ja pisze gierke w OpenGl
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?
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:
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.
Yeah. Dzięki, o to chodziło.
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
}