Jak obliczyć kąt pomiędzy punktami.

2008-03-25 18:15
0

Witam!

y|
 |
 |                  0 c
 |     0 b
 |
 |         0 a
 |
 |
 ----------------------------------->
                               x

Mam pytanie dotyczące metody Math.Atan2. Metoda z tego co rozumiem liczy tangens kąta utworzonego przez wektor (o początku [0,0] i końcu danego punku, którego współrzędne podajemy jako paramer metody)i oś x. Mi zależy na tym, aby liczyć kąty z danego punktu, czyli z punktu a o współrzędnych [x1,y1] chcę policzyć kąt pomiędzy tym punktem, a punktem b o współrzędnych [x1,y2], czy można to zrobić za pomocą tej metody, czy do rozwiązania tego problemu muszę użyć czegoś innego?
Dzięki z góry za odpowiedzi.

Pozostało 580 znaków

2008-03-25 19:33
0

Tak, wystarczy. Mając X1, Y1, X2, Y2 kreślisz prostą, obliczasz jej współczynniki a i b gdzie arctan(a) daje właśnie kąt nachylenia prostej do osi x. Pamiętaj tylko, że dostaniesz wynik w radianach a nie w stopniach.


<span style="color: blue">"Kolarstwo to jedna z najtrudniejszych dyscyplin sportu. Nawet najgorszy kolarz jest wciąż wybitnym sportowcem."
s.p. Marco Pantani
</span>

Pozostało 580 znaków

2008-03-25 19:51
0

Mozesz tez tak przekszalcic uklad, ze punkt a bedzie srodkiem ukladu(punktem 0,0) i wtedy podawac wspolrzedne dowolnego innego punktu. Wystarczy odjac od wspolrzednych podawanego punktu wspolrzedne punktu a.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-03-25 20:12
0

Przez chwilkę myślałem nad przyrównaniem początku wektora do zera, ale jakoś mi ten pomysł lepiej wpadł.


<span style="color: blue">"Kolarstwo to jedna z najtrudniejszych dyscyplin sportu. Nawet najgorszy kolarz jest wciąż wybitnym sportowcem."
s.p. Marco Pantani
</span>

Pozostało 580 znaków

2008-03-25 20:15
0

Obydwa sa wlasciwe, ale skoro ta metoda juz liczy kat, to latwiej przeksztalcic dane tak, by pasowaly ;)

@__krzysiek85 - to juz latwiej iloczyn skalarny chyba (z wektorowego trzeba jeszcze wyznacznik policzyc zdaje sie), ale to jest pewnie wlasnie to co robi metoda podana przez autora...


You need to learn how to walk
before you can run

Pozostało 580 znaków

2008-03-27 08:50
0

Metoda Atan2(y,x) zwraca faktycznie kąt między wektorem [x,y] a osią Ox. Aby uzyskać kąt między wektorami ab i ac wystaczy policzyć współrzędne tych wektorów ( tzn. ab=[xb-xa,yb-ya]=[xab,yab] ac=[xc-xa,yc-ya]=[xac,yac]), a potem liczymy kąt między nimi
angle=Atan2(yac,xac)-Atan(yab,xab).

Należy jednak pamiętać, że Atan2 zwróci nam wartość z przedziału (-Pi/2,Pi/2), więc jeśli kąty będą spoza przedziału, to dostaniemy fałszywe wartości. Można temu łatwo zapobiec sprawdzając znaki współrzędnych wektorów ab i ac, następnie sprowadzając wektory do I i IV ćwiartki układu, licząc kąty między nimi a osią Ox a następnie dodając odpowiednie wartości (Pi/2 lub -Pi/2).

Iloczyn skalarny dzielony przez iloczyn długości też jest dobrą metodą (dokładniej arccos z tego) - tutaj dostajemy wartości z przedziału [0,Pi], więc i tak nie unikniesz kombinowania. ;-P

Pozdrawiam. Piotr.

Pozostało 580 znaków

2008-03-27 09:24
0

Iloczyn skalarny to najprostsza metoda. Kąt wklęsły pomiędzy wektorami U i V to:
alfa=arccos(<U,V>) / sqrt(<U,U>*<V,V>) , gdzie <X,Y> to iloczyn skalarny X i Y.

Dla kąta BAC wektory to U=B-A, V=C-A. Licząc te wektory to tak jakbyśmy przesuwali układ współrzędnych tak, aby początek znajdował się w punkcie A.

elis napisał(a)

tutaj dostajemy wartości z przedziału [0,Pi], więc i tak nie unikniesz kombinowania. ;-P
Ale co tu kombinować, skoro między dwoma wektorami są 2 kąty - wypukły i wklęsły, gdzie ich suma to 2pi.

Jednak jeśli kierunek kąta ma znaczenie, to trzeba policzyć również sinus z iloczynu wektorowego.
sin= U[x]V / sqrt(<U,U>*<V,V>), gdzie X[x]Y to iloczyn wektorowy X i Y.
Dalej trzeba policzyć tangesn
tan=sin/cos
Policzyć kąt
alfa=arctan(tan).
Dodać do kąta 1pi, jeśli sin<0
W powyższy sposób otrzymasz lewoskrętny kąt od wektora U do wektora V

Dla 2-wymiarowej przestrzeni euklidesowej:
<U,V> = UxVx+UyVy
U[x]V = UxVy-UyVx

Ku ścisłości, iloczyn wektorowy nie istnieje w przestrzeniach 2-wymiarowych. Powyższy operator U[x]V to długość iloczynu wektorowego wektorów (Ux, Uy, 0) i (Vx, Vy, 0). Jeśli oznaczyć by K=(Ux, Uy, 0) i L=(Vx, Vy, 0), to
cos(U,V) = cos(K,L) = |K[x]L| / (|K||L|) = U[x]V / (|U||V|) = U[x]V / sqrt(<U,U>*<V,V>)

Pozostało 580 znaków

2008-03-27 09:45
0

Chodziło mi o kąt skierowany.

Pozostało 580 znaków

2008-03-27 10:22
0

No to napisz sobie strukturę dla wektora 2D, zdefiniuj operatory odejmowania, mnożenia skalarnego i mnożenia wektorowego. Dalej wg. opisu czyli
U=B-A, V=C-A
dl=sqrt(<U,U>*<V,V>)
jeśi dl==0 to jeden lub obydwa wektory są zerowe (punkt A pokrywa się z punktem B i/lub C) - brak kąta
sin=U[x]V / dl
cos=<U,V> / dl
alfa=arctan(sin/cos)
jeśli sin<0 (III i IV ćwiartka) to alfa+=PI

Tylko przetestuj czy to jest kąt BAC, czy CAB, ale z tego co pamiętam będzie to lewoskrętny kąt BAC

Pozostało 580 znaków

2008-03-27 10:33
0

adf88 napisał:

cos=<U,V> / dl
alfa=arctan(sin/cos)
jeśli sin<0 (III i IV ćwiartka) to alfa+=PI

Nie łatwiej (nie eliminujemy kątów +-Pi/2) tak:
cos=<U,V> / dl
alfa=arccos(cos)
jeśli sin<0 (III i IV ćwiartka) to alfa=-alfa
?</quote>

Pozostało 580 znaków

2008-03-27 11:21
0

adf88 napisał:

Źle. Iloczyn skalarny daje moduł.
cos = <U,V>/dl = |cos(alfa)|

Dasz za to głowę?

Np. dla [-1,1] i [1,0] nie dostaniemy wartości nieujemnej.

Chodziło Ci chyba o cos(|alfa|), a to w moim sposobie jest załatwione (przy sin<0).

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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