Dzien dobry,

Mam taki problem, z ktorym nie moge sobie poradzic.

Wyobrazmy sobie plytke drukowana ktory podaje nam relacje miedzy swoim polozeniem w przestrzeni a pozycja wektora przyspieszenia ziemskiego g w nastepujacej formie [X,Y,Z], gdzie odpowiednio X, Y, Z sa wartosciami rzutu wektora g na osie x, y, z. Wartosci nie informuja nas o zwrocie wektora (czyli sa bez znaku).

Np. dla osi Y rzut wektora g wyglada nastepujaco, oczywiscie z wartosciami posrednimi w polozeniach pomiedzy (45 stopni do poziomu to Y=90) :

   60
 /     \

120 120
\ /
180

Co po normalizacji (-120 oraz /60) daje nam cos takiego:

-1
/
0 0
\ /
1

Tak samo dla X, a dla Z obracamy kolo (w tych moich AsciiArtach wyglada raczej jak romb) o 90 stopni w lewo.

Wynika z tego natychmiast jedno ograniczenie : poniewaz w tym ukladzie wspolrzednych wektor z skierowany jest pionowo w dol, tym samym obrot dookola osi z nie powoduje zadnych zmian wskazan czujnikow. Mowiac po ludzku : kladziemy plytke na stole (idealnie poziomo). Obrocenie jej o dowolny kat bez odrywania od stolu (czyli tak jakby wzgledem pionowej osi przechodzacej przez ktorykolwiek rog plytki) nie powoduje zadnych zmian wskazan czujnikow (X:120 Y:120 Z:180), albo tez po normalizacji (X:0 Y:0 Z:1).

           Y

| ||
| | X
|
_______________|

Rotacja wzgledem krawedzi oznaczonej powyzej jako X daje nastepujace rezultaty :
0 stopni - (X:120 Y:120 Z:180)
45 stopni - (X:80 Y:120 Z:160)
90 stopni - (X:60 Y:120 Z:120)
135 stopni - (X:80 Y:120 Z:80)
180 stopni - (X:120 Y:120 Z:60)
i tak dalej

Natomiast wzgledem krawedzi Y daje nastepujace rezultaty :
0 stopni - (X:120 Y:120 Z:180)
45 stopni - (X:120 Y:80 Z:160)
90 stopni - (X:120 Y:60 Z:120)
135 stopni - (X:120 Y:80 Z:80)
180 stopni - (X:120 Y:120 Z:60)
i tak dalej

Mysle ze mozecie to sobie mniej wiecej wyobrazic.

Na czym polega moj problem?

Usiluje te dane przelozyc na kat obrotu wzgledem osi x i y, na potrzeby wizualizacji wzglednego polozenia plytki drukowanej wzgledem wektora g. Kat liczylem uzywajac funkcji arcus cosinus wzgledem cosinusa kata miedzy wektorem [X Y Z] a wektorem odniesienia ref o wspolrzednych [0 0 1] (czyli tak jakby odpowiednikiem wektora g w przestrzeni wizualizacji) policzonym z prostego iloczynu wektorowego.

angleX = acos( (zref.Z+yref.Y)/(sqrt(yy+zz)sqrt(ref.Yref.Y+ref.Zref.Z)) )/M_PI180;
angleY = acos( (zref.Z+xref.X)/(sqrt(xx+zz)sqrt(ref.Xref.X+ref.Zref.Z)) )/M_PI180;

Niestety przy katach zblizonych do 90 stopni zaczynaja sie dziac dziwne rzeczy, to znaczy ja przekrecam plytke o 90 stopni wzgledem osi Y, a na ekranie jej obraz przekreca sie o 90 stopni wzgledem osi Y (dobrze) i jednoczesnie o 90 stopni wzgledem osi X (zle). Dla malych katow tego problemu nie ma. Czy ktos ma pomysl dlaczego? Co robie nie tak? Matematyke na studiach mialem na pierwszych latach, w zwiazku z tym moze teraz zle rozumuje? Moze blednie zinterpretowalem dane z czujnikow?

Bylbym bardzo wdzieczny za wszelkie pomysly na rozwiazanie tego problemu, bo zaczyna brakowac mi juz pomyslow. Oryginalnie chcialem to wrzucic na forum C++, ale zaczalem od watku nietuzinkowe problemy. Ze zwgledu na brak odzewu, wtedy umieszczam posta ponownie, tym razem w dziale C++.